web-dev-qa-db-ja.com

管理ページのカスタム投稿タイプのカスタムフィールドで絞り込む

コンテストの名前、回答などのカスタムフィールドを作成するためにAdvanced Custom Fieldsを使用しました。画像に示すようにコンテスト用のカスタム投稿タイプを作成し、Wordpress functions.phpを使用してカスタムフィールド値から列を作成しました。

下に示すような競合の異なる名前/ラベルの "Filter by"ドロップダウンボックスを取得しようとしていますが、分類法を使用した解決策しか見つけることができません。可能であればを使用しない私は他のすべてにカスタムフィールドしか使用していないからです。

カスタムフィールドのみを使用してカスタムの[フィルタ基準]ドロップダウンを作成することは可能ですか?

Wordpress filter by

9
grAND

そしてFilterの結果を表示するためにこのコードを試してみてください

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

必要に応じてメタキーとメタ値を変更してください。私は "競争名をmeta_keyとし、"競争名 "を選択ドロップダウン名としました。

11
Aftab

restrict_manage_posts アクションはadd_extra_tablenav()関数をトリガーします。これは、希望するリストテーブルにドロップダウンを追加する方法です。

以下の例では、最初に Post Type が正しいことを確認してから、postmetaテーブルのcompetition_nameキーに対して格納されているすべてのDB値を取得します(必要に応じてキー名を変更する必要があります)。クエリはかなり基本的なもので、 Competition が公開されているかどうかを確認し、一意の値のみを取り(ドロップダウンで重複したくない)、アルファベット順に並べます。

次に結果をチェックし(何もしないでドロップダウンを出力しても意味がありません)、次にオプション(すべてを表示するためのデフォルトを含む)を作成します。最後にドロップダウンが出力されます。

私のコメントで述べたように、これは物語の終わりではありません。フィルタがアクティブなときにリストテーブルに希望の結果だけを表示するように指示するロジックが必要ですが、それを見て、さらに支援が必要な場合は別の質問を始めることにします。 ヒント - ファイル/wp-admin/includes/class-wp-posts-list-table.phpをチェックアウトしてください。それが親です.../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}
9
David Gard

これがだれにもうまくいかない場合、私の解決策は私がカスタム投稿タイプのソート可能な列のリストにフィルタしようとしていた列を追加する必要がありました。

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );