web-dev-qa-db-fra.com

Modifier la requête sur edit.php

Quel est le meilleur moyen de modifier la requête en cours d'exécution sur l'écran d'édition des publications (edit.php)?

La méthode que j'utilise actuellement est de passer un argument à la commande globale $ wp_query de la manière suivante:

$wp_query->query( array ('category__in' => array(14,9,2) ) );

Cependant, cela ne fonctionne pas vraiment comme prévu une fois que l'utilisateur a recherché des pages, des filtres ou des recherches.

3
user2607

Il y a quelques jours, j'ai écrit une solution rapide en utilisant pre_get_posts filter pour masquer certaines pages de la zone d'administration.
Vous pourriez peut-être l'utiliser comme un bon point de départ pour tout ce que vous voudriez accomplir.

if ( is_admin() ) add_filter('pre_get_posts', 'mau_filter_admin_pages');

function mau_filter_admin_pages($query) {
     $query->set('post__not_in', array(1,2,3) );
     // Do not display posts with IDs 1, 2 and 3 in the admin area.
     return $query;
}

Mais soyez prudent: pre_get_posts affecte presque toutes les requêtes de publication sur votre site. Vous devrez utiliser certaines conditions pour que cela ne fonctionne que si vous le souhaitez. if (is_admin()) me suffisait, mais comme je l'ai dit, c'était une solution rapide et je ne l'ai pas encore testée correctement.

Je suis sûr que des ninjas locaux vont corriger cela s'il est trop sale.)

3
Michal Mau

Je suis sûr que des ninjas locaux vont corriger cela s'il est trop sale.)

Ce n'est pas une mauvaise approche, mais je peux donner quelques indications pour améliorer la fonction, lisez la suite ...

Après avoir donné de nombreux exemples d'utilisation de pre_get_posts, il est devenu évident que pre_get_posts peut en réalité fonctionner plusieurs fois sur une page donnée (au moins on me l'a dit et lu autant) et cela peut signifier que votre fonction de rappel sera parfois appelé plusieurs fois (quand il n’est pas nécessaire de le faire).

Plutôt que d'utiliser pre_get_posts, une alternative consiste à utiliser parse_query, qui s'exécute directement vers la fin de l'objet de requête et ne s'exécute qu'une seule fois, tout en fournissant le niveau de contrôle nécessaire sur les paramètres de la requête.

Comme je l'ai également souligné dans les commentaires de la réponse de maugly, pre_get_posts sera utilisé pour pratiquement toutes les requêtes de publication sur votre site. Il est donc important que, lors de l'ajout de filtres/actions à ce hook, vous utilisiez une spécificité spécifique pour éviter que le filtre ne soit exécuté. quand ce n'est pas voulu. Je dis presque toutes les requêtes car il existe un paramètre qui peut être défini pour une requête post donnée afin de contourner les filtres (suppress_filters si je me souviens bien).

WordPress définit diverses variables administratives dans admin.php pour chaque page afin que vous puissiez (et que le code de base le permet) déterminer quel type de page est affiché à un moment donné, certaines d'entre elles le sont. .

$pagenow
$parent_file
$plugin_page
$submenu_file
$typenow

Ces variables fournissent suffisamment d'informations sur une page d'administration pour faciliter l'exécution d'un filtre ou d'une action sur une ou plusieurs pages de sélection.

Vous pouvez voir comment ces variables sont définies ici dans le source.
http://core.trac.wordpress.org/browser/tags/3.0.4/wp-admin/admin.php

Dans le cas de la liste de publication, nous pouvons nous attendre à ce que $pagenow soit edit.php et $typenow soit curieusement vide (ce n’est le cas que lorsque le type de publication est post).

Vous pouvez conditionnellement ajouter ce filtre à la requête en utilisant une logique conditionnelle pour élaborer la page, comme suit ...

add_action( 'admin_init', 'possibly_add_exclude_filter' );
function possibly_add_exclude_filter() {
    global $pagenow, $typenow;
    if( 'edit.php' == $pagenow && '' == $typenow ) 
        add_action( 'parse_query', 'set_viewable_posts_by_cat' );
}
function set_viewable_posts_by_cat() {
      set_query_var('category__in', array(1) );
      return;
}

J'espère que c'est utile .. :)

4
t31os