web-dev-qa-db-ja.com

任意の投稿タイプのすべてのカスタムフィールドを取得する方法

私はいくつかの投稿タイプがあります。その投稿タイプに関連付けられているすべてのカスタムフィールドを取得したいです。

例:

Post
-- image
-- Featured image
-- body

すべてのフィールドまたはカスタムフィールドを配列で取得する必要があります。私は解決策を見つけました ここから 、しかしそれは私の目的を達成するものではありません:

    echo '<pre>';
    print_r(get_post_custom($post_id));
    echo '</pre>';
4
user115277

Functions.phpに次のコードを追加してください。

acfの場合

function get_all_meta($type){
              global $wpdb;
              $result = $wpdb->get_results($wpdb->prepare(
                  "SELECT post_id,meta_key,meta_value FROM wp_posts,wp_postmeta WHERE post_type = %s
                    AND wp_posts.ID = wp_postmeta.post_id", $type
              ), ARRAY_A);
               return $result;
          }

function acf(){
    $options = array();
    $acf = get_all_meta('acf');
    foreach($acf as $key => $value){
      $options['post_type'][$value['post_id']]['post_id'] = $value['post_id'];
      $test = substr($value['meta_key'], 0, 6);
      if($test === 'field_'){
        $post_types = maybe_unserialize( $value['meta_value'] );
        $options['post_type'][$value['post_id']]['key'][] = $post_types['key'];
        $options['post_type'][$value['post_id']]['key'][] = $post_types['name'];
        $options['post_type'][$value['post_id']]['key'][] = $post_types['type'];
      }
      if($value['meta_key'] == 'rule'){
        $post_types = maybe_unserialize( $value['meta_value'] );

        $options['post_type'][$value['post_id']]['post_types'] = $post_types['value'];
      }
    }
    return $options;
  }

これにより、acfのpostメタキーの配列値がわかります。

使い方

foreach(acf() as $key => $value){
update_post_meta(76, $value['type'], 'Steve');
}

ポッド用

function pods(){global $ wpdb; //ポッドの投稿タイプIDを取得します。

    $result = $wpdb->get_results($wpdb->prepare(
      "SELECT ID,post_title,post_parent FROM wp_posts WHERE post_type = %s", $type
    ), ARRAY_A);

// pods each field for a post type create separate post type so again query to get the field post type result.
    $pods_field_post_type = array();    
    foreach($result as $value){
    $pods_field_post_type = $wpdb->get_results($wpdb->prepare(
    "SELECT ID,post_title,post_name FROM wp_posts WHERE post_type = %s
    AND post_parent = %d
    ", '_pods_field',$value["ID"]
    ), ARRAY_A);

    }
$fields = array();
   foreach($pods_field_post_type as key => $value):
     $podsAPI = new PodsAPI();
     $pod = $podsAPI->load_pod( array( 'name' => '
  post' ));
     $fields[] = $pod['fields'][$value['post_name']]['type'];
  endforeach;
  }
print_r($fields);

使い方

foreach($fields as $key => $value){
update_post_meta(76, $value, 'Steve');
}

関数acf()とpods()はあなたにその投稿タイプの正確なメタキーを与えます。コードをコピーして貼り付けるとうまくいかないことがあります。

この答えがあなたにも他の人にも役立つことを願います。

何も問題がないことをお知らせください。

1
Faysal Mahamud

投稿タイプ

"features" /特定の投稿タイプがサポートする/のリストを取得するためのいくつかのオプションがあります。最も簡単な方法は、単純に get_all_post_type_supports()関数 を使用することです。

$post_type_features = get_all_post_type_supports( 'post' );

print_r( $post_type_features );
/* Array
 * (
 *   [0] => author
 *   [1] => editor
 *   [2] => thumbnail
 *   [3] => excerpt
 *   [4] => trackbacks
 *   [5] => custom-fields
 *   [6] => comments
 *   [7] => revisions
 *   [8] => post-formats
 *   [9] => title
 * )
 */

投稿タイプが特定の機能をサポートしているかどうかを確認するために post_type_supports() を使用することもできます。

投稿タイプの機能をチェックして、投稿タイプオブジェクトを取得して$supportsプロパティをチェックする別の方法です。

$post_type_object = get_post_type_object( 'post' );

print_r( $post_type_object->supports );

カスタムフィールド

カスタムフィールド are 投稿メタデータ 投稿タイプではなく投稿ごとに関連付けられているため、特定の投稿で使用されているカスタムフィールド名のリストを取得する直接的な方法はありません。タイプ。

そうではなく、問題の投稿タイプのすべての投稿をループ処理し、その投稿用に格納されたすべてのカスタムフィールドを取得するためにget_metadata( $post_id )またはget_post_custom_keys( $post_id )を使用して、配列を自分でコンパイルする必要があります。これは潜在的にvery高価な操作であり、できるだけ少ない頻度で実行する必要があります - これが毎週または月に2回以上実行することを検討しているものである場合、あなたはあなたの最終目標を達成するための他の方法を調べます。

この情報を決定するためのカスタムSQLクエリも可能であり、投稿タイプのすべての投稿についてメタデータをクエリするよりもはるかにパフォーマンスが高いことは間違いありません。

3
bosco