web-dev-qa-db-ja.com

ドロップダウン選択、カスタム投稿タイプで管理者に投稿をフィルタリング

カスタムフィルタドロップダウンを使用して、管理領域の投稿をフィルタしようとしています。

私はそれを作るためにこの方法を使用します: https://wordpress.stackexchange.com/a/45447/84541

これが私のコードです:

   add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );

    function wpse45436_admin_posts_filter_restrict_manage_posts(){
        $type = 'post';
        if (isset($_GET['post_type'])) {
            $type = $_GET['post_type'];
        }

        //only add filter to post type you want

        if ('post' == $type){
            //change this to the list of values you want to show
            //in 'label' => 'value' format
            $values = array();
            $testting = get_posts(array('posts_per_page'=>-1, 'post_type'=>'edition'));
            foreach($testting as $post):
                $values[$post->post_title] = $post->ID;


            endforeach; 


            ?>

            <select name="ADMIN_FILTER_FIELD_VALUE">
            <option value=""><?php _e('Toutes les éditions ', 'wose45436'); ?></option>
            <?php
                $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
                foreach ($values as $label => $value) {
                    printf(
                            '<option value="%s"%s>%s</option>',
                            $value,
                            $value == $current_v? ' selected="selected"':'',
                            $label
                        );
                    }
            ?>
            </select>

            <?php
        }
    }

    add_filter( 'parse_query', 'wpse45436_posts_filter' );

    function wpse45436_posts_filter( $query ){
        global $pagenow;
        $type = 'post';
        if (isset($_GET['post_type'])) {
            $type = $_GET['post_type'];
        }
        if ( 'post' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') {
            $query->query_vars['meta_key'] = 'n_de_ldition';
            $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
        }
    }

ドロップダウン選択でオプションを選択した後にフィルタをクリックすると、フィルタは正常に実行されますが、選択にオプションを追加していたクエリが空になります。何が間違っているのか理解できません。カスタム投稿タイプ情報を取得するためにget_postsを使用しているからですか?

ここにいくつかの画像があります。フィルタリングされていないが選択ドロップダウンをクリックした場合: Before filtering 

フィルタリングの後、選択されたドロップダウンからのオプションはもう利用できませんが、フィルタはうまく働きました: After Filtering 

これを交換すると:

            $values = array();
            $testting = get_posts(array('posts_per_page'=>-1, 'post_type'=>'edition'));
            foreach($testting as $post):
                $values["N°".$post->post_title] = $post->ID;


            endforeach; 

これを聖霊降臨祭:

    $values = array(
        'label' => 'value', 
        'label1' => 'value1',
        'label2' => 'value2',
    );

うまく機能しますが、ラベルと値を動的に変更する必要があります。

何か案が?

前もって感謝します。

1
Ceyar

どうもありがとう、それは働いています。これが私の修正したコードです。

function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 
        'post' == $type  
         && is_admin()  
         && $pagenow =='edit.php'  
         && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) 
         && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '' 
         && $query->is_main_query()
     ) {
            $query->query_vars['meta_key'] = 'n_de_ldition';
            $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
        }
    }

メインクエリを$query->is_main_query()でターゲティングすることで、選択ボックスに入力するために使用するget_posts()呼び出しを変更することを避けます。その理由は、get_posts()WP_Queryのラッパーにすぎないため、parse_queryフックも同様にそれに影響を与える可能性があるためです。

4
Ceyar