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


11

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

以下に示すように、競争別の名前/ラベルが付いた[フィルター]ドロップダウンボックスを取得しようとしていますが、分類法を使用した解決策しか見つけることができません。カスタムフィールドのみを使用しているため、可能であれば使用しませんほかのすべて。

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

ワードプレスフィルター


restrict_manage_postsアクションフックを利用して、ドロップダウンボックスを追加できます。WPはボックスから何をすべきかを知らないので(フィルターが自動的に処理できる分類法ドロップダウンリストとは異なり)、フィルターのロジックも追加する必要があることを忘れないでください。
David Gard

追加の考えとして-必要に応じて、[ 名前]をリストテーブル内にリンクすることができます。つまり、ドロップダウンではなく、名前をクリックして、コンテストをフィルタリングできます。
David Gard、2015

回答:


12

そして、フィルターの結果を表示するには、このコードを試してください

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として、「コンペティション名」をドロップダウン名として選択しました。


いいですね、私は怠惰な気持ちでしたので、彼に追加の質問をするよう提案しました;)
David Gard

2つの回答は完全な回答であり、組み合わせる必要があるようです。
RCNeil 2017

10

restrict_manage_postsのアクションをトリガーするadd_extra_tablenav()、あなたの希望リスト表に追加のドロップダウンを追加する方法である機能を、。

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

次に、結果を確認し(ドロップダウンを何も出力しないポイントはありません)、オプションを作成します(すべてを表示するデフォルトを含む)。最後にドロップダウンが出力されます。

私のコメントで述べたように、これで話は終わりではありません。フィルターがアクティブな場合に目的の結果のみを表示するようにリストテーブルに指示するためのロジックが必要ですが、それを見て、さらに支援が必要な場合は別の質問を開始するようにします。ヒント -ファイルをチェックアウトし、/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;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** 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) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $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>';

}

これを使用すると、エラーが発生しますNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

同じエラーが発生します
Vasim Shaikh

0

これが誰にとっても機能しない場合、私の解決策は、カスタム投稿タイプのソート可能な列のリストに、フィルターに使用しようとした列を追加することでした。

// 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' );

0

以下のクエリを置き換えて、wpdb:prepareエラーを修正します。

$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,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.