web-dev-qa-db-fra.com

Problème avec l'ajout d'un nombre à "sous-sous-pseudo" aka liens rapides sur custom_post_type

Il me manque un concept de base. J'essaie d'ajouter plusieurs liens "subsubub" ou liens rapides vers

"All | published | draft | trash".

Essayez d'ajouter "Type de message personnalisé renvoyé (#)" et quelques autres. Le (#) est ce qui continue à être changé à 0 sauf si vous êtes sur la page avec les posts.

Je viens d'essayer de définir posts_per_page à la requête comme un commentaire l'a dit ici, mais aucun changement.

Je les ai montrer, mais le compte est faux. Ils affichent tous 0 à moins que vous ne cliquiez sur le lien, le nombre correspondant sera alors renvoyé. Si je vais à dire "Type de message personnalisé renvoyé", le "Type de message personnalisé utilisé" passe à 0.

J'ai essayé wp_reset_query () et wp_reset_post_data (); après chaque requête, mais pas de chance.

J'ai aussi une fonction pour pre_get_posts, qui ajoute simplement $ query-> set ('post_type') pour filtrer le contenu de la page, mais je suppose que les liens sont distincts de pre_get_posts.

Quelqu'un m'indique dans la bonne direction ce que je fais mal?

Oh, et la raison pour laquelle c'est add_filter ('blah', array ($ THIS, 'etc')) est parce que c'est dans une classe, donc je dois spécifier "$ this".

add_filter('views_edit-custom_post_type',array($this,'add_custom_post_type_to_subsubsub'));

public function add_custom_post_type_to_subsubsub($views){
    if( ( is_admin() ) && ( $_GET['post_type'] == 'custom_post_type' ) ) {

         $query = array(
             'post_type'   => 'custom_post_type',
             'post_status' => 'publish',
             'meta_key'    => 'special_meta_key'
         );

         $result = new WP_Query($query);
         $class = ($_GET['special_meta_key'] == '1' && $_GET['special_meta_key_returned'] != '1') ? ' class="current"' : '';

         $views['custom_post_type'] = sprintf(__('<a href="%s" '.$class.'>custom_post_type Vouchers <span class="count">(%d)</span></a>', 'custom_post_type' ), admin_url('edit.php?post_type=custom_post_type&special_meta_key=1'), $result->found_posts);

         $querytwo = array(
             'post_type'   => 'custom_post_type',
             'post_status' => 'publish',
             'meta_key'    => 'special_meta_key',
             'meta_query' => array(
                    array(
                        'key' => 'usage_count',
                        'value' => '0',
                        'compare' => '>'
                    )
                )
         );

         $resulttwo = new WP_Query($querytwo);
         $class2 = (isset($_GET['special_meta_key_returned']) && $_GET['special_meta_key_returned'] == "1") ? ' class="current"' : '';

         $views['custom_post_type_returned'] = sprintf(__('<a href="%s" '.$class2.'>Returned custom_post_type Vouchers <span class="count">(%d)</span></a>', 'custom_post_type' ), admin_url('edit.php?post_type=custom_post_type&special_meta_key_returned=1'), $resulttwo->found_posts);

        $querythree = array(
             'post_type'   => 'custom_post_type',
             'post_status' => 'publish',
             'meta_query' => array(
                    array(
                        'key' => 'usage_count',
                        'value' => '0',
                        'compare' => '>'
                    )
                )
         );

         $resultthree = new WP_Query($querythree);
         $class3 = ($_GET['used_type'] == '1') ? ' class="current"' : '';

         $views['used_types'] = sprintf(__('<a href="%s" '.$class3.'>Used Vouchers <span class="count">(%d)</span></a>', 'custom_post_type' ), admin_url('edit.php?post_type=custom_post_type&used_type=1'), $resultthree->found_posts);

         //exit(var_dump($resulttwo));
         return $views;
     }

}
1
Darius

Utilisez pre_get_posts filter & utilisez la fonction is_main_query() pour vérifier le contexte (comme vous l'avez découvert dans la conversation avec @Milo ), toutefois, n'utilisez pas directement is_main_query().

Lorsque vous utilisez is_main_query() pour vérifier le contexte, il vérifie toujours par rapport au $wp_query global principal au lieu d'un autre objet de requête personnalisé que vous souhaitez peut-être. Cela peut donc provoquer un comportement inattendu.

Pour vous assurer que vous filtrez le contexte correct, utilisez le paramètre $query qui a été transmis à la fonction de rappel de pre_get_posts hook. Donc, au lieu de vérifier is_main_query(), vous allez vérifier $query->is_main_query(). Par exemple:

function wpse_example_filter( $query ) {
    if ( is_admin() && $query->is_main_query() ) {
        // $query modification CODE
    }
}
add_action( 'pre_get_posts', 'wpse_example_filter' );
1
Fayaz