web-dev-qa-db-fra.com

Filtres post dans admin avec sélection par liste déroulante, type de post personnalisé

J'essaie de filtrer ma publication dans ma zone d'administration avec une liste déroulante de filtres personnalisée.

J'utilise cette méthode pour le rendre: https://wordpress.stackexchange.com/a/45447/84541

Voici mon code:

   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'];
        }
    }

Lorsque je clique sur le filtre après avoir sélectionné mon option dans ma liste déroulante, il filtre correctement mais ma requête d'ajout d'option dans ma sélection est vide. Je ne comprends pas ce que je fais de mal. Est-ce parce que j'utilise get_posts pour obtenir les informations relatives à mon type de message personnalisé?

Voici quelques images. Si non filtré mais cliqué sur le menu déroulant de sélection:  Before filtering 

Après filtrage, les options du menu déroulant sélectionné ne sont plus disponibles, mais les filtres ont bien fonctionné:  After Filtering 

Si je remplace ceci:

            $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; 

avec ceci:

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

Cela fonctionne bien mais je dois changer mes étiquettes et mes valeurs de manière dynamique.

Une idée?

Merci d'avance.

1
Ceyar

Merci beaucoup, ça marche. Voici mon code modifié:

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'];
        }
    }

En ciblant la requête principale avec $query->is_main_query(), nous évitons de modifier notre appel get_posts() que nous utilisons pour renseigner la zone de sélection. La raison en est que get_posts() est juste un wrapper pour le WP_Query, de sorte que le hook parse_query peut également l’affecter.

4
Ceyar