Comment exclure le modèle de page wordpress (modèle personnalisé) des résultats de recherche ?

Publié par Jean-Michel le

J’ai créé un modèle de page personnalisé.

<?php
/*
 * Template Name: foo
 */
?>

Ce nom de fichier est « foo.php ».

j’ai essayé

global $query_string;
query_posts($query_string . "&post_type=post");

Mais toutes les pages seront exceptées….

Comment exclure uniquement ce modèle de page des résultats de recherche wordpress ?

Solution n°1 trouvée

Pour tous ceux qui trébuchent sur ce fil et ne réussissent pas sur les nouvelles versions de WP : les arguments $query doivent être définis à la place en refaisant query_posts… comme suit :

// exclude any content from search results that use specific page templates
function exclude_page_templates_from_search($query) {

    global $wp_the_query;
    if ( ($wp_the_query === $query) && (is_search()) && ( ! is_admin()) ) {

            $query->set(
                'meta_query',
                array(
          array(
              'key' => '_wp_page_template',
              'value' => 'page-template-1.php',
              'compare' => '!='
              )
          )
      );
    }

}
add_filter('pre_get_posts','exclude_page_templates_from_search');

Solution n°2 trouvée

La requête mentionnée par Nicolay est très pratique, mais elle supprime également tous les messages des résultats de la recherche, car les messages ne contiennent pas la '_wp_page_template'clé. Pour avoir toutes les pages (sans le modèle filtré) ainsi que tous les articles, vous devez procéder comme suit :

// exclude any content from search results that use specific page templates
function exclude_page_templates_from_search($query) {
    global $wp_the_query;
    if ( ($wp_the_query === $query) && (is_search()) && ( ! is_admin()) ) {
        $meta_query = 
            array(
// set OR, default is AND
                'relation' => 'OR',
// remove pages with foo.php template from results
                array(
                    'key' => '_wp_page_template',
                    'value' => 'foo.php',
                    'compare' => '!='
                ),
// show all entries that do not have a key '_wp_page_template'
                array(
                    'key' => '_wp_page_template',
                    'value' => 'page-thanks.php',
                    'compare' => 'NOT EXISTS'
                )
            );
        $query->set('meta_query', $meta_query);
    }
}
add_filter('pre_get_posts','exclude_page_templates_from_search');

Des informations détaillées à ce sujet peuvent être trouvées dans le WordPress Codex.

Solution n°3 trouvée

Essaye ça:

global $wp_query;
$args = array_merge($wp_query->query, array(
    'meta_query' => array(
        array(
            'key' => '_wp_page_template',
            'value' => 'foo.php',
            'compare' => '!='
        )
    ),
));
query_posts( $args );

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *