Je suis tombé dernièrement sur un cas relativement intéressant… Je travaillais sur un site utilisant le plugin WP Orbit Slider. WP Orbit Slider est un petit plugin qui permettant d’afficher des slideshows. Il est relativement basique et fait bien son boulot…

Sauf que…

Je me suis rendu compte en effectuant une recherche sur le site que les slides WP Orbit apparaissaient dans la liste des résultats. Personnellement je trouve ça étrange, et je ne veux pas que des slides apparaissent dans les résultats de recherche…

Le plugin crée un custom post type pour gérer ses slides, et ce sont ces custom posts qui apparaissent dans les résultats. J’ai donc jeté un oeil au code du plugin et voici comment le plugin enregistre son custom post type:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$defaults = array('labels' => array('name' => $this->plural,
    'singular_name' => $this->singular,
    'search_items' => __('Search ', 'wp-orbit-slider').$this->plural,
    'popular_items' => __('Popular ', 'wp-orbit-slider').$this->plural,
    'all_items' => __('All ', 'wp-orbit-slider').$this->plural,
    'parent_item' => __('Parent ', 'wp-orbit-slider').$this->singular,
    'parent_item_colon' => sprintf( __('Parent %s:', 'wp-orbit-slider'), $this->singular ),
    'edit_item' => __('Edit ', 'wp-orbit-slider').$this->singular,
    'update_item' => __('Update ', 'wp-orbit-slider').$this->singular,
    'add_new_item' => __('Add New ', 'wp-orbit-slider').$this->singular,
    'new_item_name' => sprintf( __('New %s Name', 'wp-orbit-slider'), $this->singular ),
    'separate_items_with_commas' => sprintf( __('Separate %s with commas', 'wp-orbit-slider'), $this->plural),
    'add_or_remove_items' => __('Add or remove ', 'wp-orbit-slider').$this->plural,
    'choose_from_most_used' => __('Choose from the most used ', 'wp-orbit-slider').$this->plural),
    'rewrite' => array('slug' => $this->slug)
);

L’auteur du plugin n’a pas cru bon d’exclure son custom post type des résultats de recherche. Pourtant, il lui suffisait d’ajouter exclude_from_search au tableau de paramètres mais pour une raison que j’ignore il ne l’a pas fait.

Bon, maintenant que j’ai trouvé la raison, il me faut encore trouver comment résoudre le problème… La solution la plus évidente, et la moins bonne, est d’ajouter dans ce tableau la clé exclude_from_search avec la valeur true:

1
exclude_from_search => true,

Sauf que (bis)… Cette solution n’est pas élégante, car elle implique de modifier le code d’un plugin qui ne m’appartient pas! De plus, en cas de mise à jour du plugin par son auteur (on peut toujours rêver, il n’y a eu aucune mise à jour depuis plus de deux ans…), les modifications seront écrasées et les custom post types seront à nouveau inclus dans les résultats de recherche.

Heureusement, il y a une action très intéressant nous permettant de modifier les valeurs des paramètres du custom post type, il s’agit de l’action registered_post_type. Cette action permet d’intercepter la création d’un custom post type et de modifier ses paramètres de création.

Un petit exemple valant mieux qu’un long discours, voici le code:

1
2
3
4
5
6
7
8
9
10
11
/**
 * Vérifie que le custom post est celui créé par le plugin WP Orbit Slider et modifie son paramètre `exclude_from_search`
 */
function my_registered_post_type_handler( $post_type, $args ) {
    if( 'vp_orbitslides' == $post_type ) {
       $args->exclude_from_search = true;
    }
}

// Intercepter la création des custom post types
add_action( 'registered_post_type', 'my_registered_post_type_handler', 10, 2 );

La fonction de callback my_registered_post_type_handler reçoit deux paramètres, le nom du custom post type et ses arguments. Attention, les arguments sont passés via un objet et non un tableau!

Quelques nouvelles

Bien…. Ca fait plus de 5 mois que je n’ai plus rien posté sur ce blog, la honte! Pourtant les idées se bousculent au portillon…## Ce qu …… Continuer la lecture