it-swarm.com.de

Filtert den Beitrag in Admin mit Dropdown-Auswahl und benutzerdefiniertem Beitragstyp

Ich versuche, meinen Beitrag in meinem Admin-Bereich mit einem benutzerdefinierten Filter-Dropdown zu filtern.

Ich verwende diese Methode, um es zu machen: https://wordpress.stackexchange.com/a/45447/84541

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

Wenn ich nach Auswahl meiner Option in der Dropdown-Auswahl auf Filter klicke, funktioniert der Filter einwandfrei, aber meine Abfrage, wer die Option in meiner Auswahl hinzugefügt hat, ist leer. Ich kann nicht verstehen, was ich falsch mache. Liegt das daran, dass ich get_posts verwende, um meine benutzerdefinierten Post-Typinformationen abzurufen?

Hier sind einige Bilder. Wenn nicht gefiltert, aber angeklickt, Dropdown auswählen:  Before filtering 

Nach dem Filtern sind die Optionen der ausgewählten Dropdown-Liste nicht mehr verfügbar, aber die Filter haben einwandfrei funktioniert:  After Filtering 

Wenn ich das ersetze:

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

mit diesem:

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

Es funktioniert einwandfrei, aber ich muss meine Bezeichnungen und Werte dynamisch ändern.

Irgendeine Idee?

Danke im Voraus.

1
Ceyar

Vielen Dank, es funktioniert. Hier ist mein geänderter Code:

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

Indem wir die Hauptabfrage mit $query->is_main_query() ausrichten, vermeiden wir, unseren get_posts()-Aufruf zu ändern, mit dem wir das Auswahlfeld ausfüllen. Der Grund dafür ist, dass get_posts() nur ein Wrapper für den WP_Query ist, sodass der parse_query-Hook sich auch darauf auswirken kann.

4
Ceyar