¿Cómo excluir la plantilla de página de wordpress (plantilla personalizada) de los resultados de búsqueda?

4 minutos de lectura

avatar de usuario
Shiro

Creé una plantilla de página personalizada.

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

Este nombre de archivo es “foo.php”.

Lo intenté

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

Pero todas las páginas serán exceptuadas….

¿Cómo excluir solo esta plantilla de página de los resultados de búsqueda de wordpress?

Para cualquiera que tropiece con este hilo y no tenga éxito en las versiones más nuevas de WP: los argumentos de $query deben establecerse en lugar de rehacer query_posts… de la siguiente manera:

// 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');

  • Esto excluyó la plantilla de la página para mí, pero también excluyó todas las publicaciones, por lo que solo las páginas son visibles en la búsqueda. Todavía estoy tratando de encontrar una solución a esto.

    – Mark Rummel

    7 dic 2015 a las 22:17

  • Usé la solución de Florian junto con el uso de Edygar para la versión más nueva de WP de $query Y funcionó.

    – Mark Rummel

    8 de diciembre de 2015 a las 0:46

avatar de usuario
florián

La consulta mencionada por Nicolay es muy útil, pero también elimina todas las publicaciones de los resultados de búsqueda, porque las publicaciones no contienen el '_wp_page_template' llave. Para tener todas las páginas (sin la plantilla filtrada), así como todas las publicaciones, debe hacer lo siguiente:

// 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');

Se puede encontrar amplia información sobre esto. en el códice de WordPress.

  • Usé esta solución junto con las ediciones de Edygar para la versión más nueva de WP de $query Y funcionó.

    – Mark Rummel

    8 de diciembre de 2015 a las 0:45

avatar de usuario
Nikolái Yordanov

Prueba esto:

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

  • Gracias Nikolay: ¡Prueba tu código! Pero… no funciona esta X( Pero el resultado fue el mismo… hmm…

    -shiro

    19 de septiembre de 2011 a las 15:05

¡Gracias Nikolai! Por alguna razón, anoche no estaba haciendo que esto funcionara, pero hoy, después de una hora o dos, lo hice. Puede haber sido simplemente el hecho de que estaba usando el filtro incorrecto o me faltaba la última línea de su código.

En mi caso, quería excluir el contenido en función de varias plantillas, por lo que agregué más elementos de matriz de clave/valor/comparación. También solo quería hacer esto durante una búsqueda, así que agregué una cláusula condicional para eso. Aquí está la función completa que agregué al archivo functions.php de mi tema:

// 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()) ) {

        $args = array_merge($wp_the_query->query, array(
        'meta_query' => array(
            array(
                'key' => '_wp_page_template',
                'value' => 'page-template-1.php',
                'compare' => '!='
                ),
            array(
                'key' => '_wp_page_template',
                'value' => 'page-template-2.php',
                'compare' => '!='
                ),
            array(
                'key' => '_wp_page_template',
                'value' => 'page-template-3.php',
                'compare' => '!='
                )
            ),
        ));

        query_posts( $args );

    }

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

Tuve que excluir más de una plantilla de página, así que tuve que adaptar un poco el código anterior, pero al final, esto funcionó para mí:

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' => array('page-landings-new.php', 'page-landings-EU.php', 'page-thankyou.php'),
                    'compare' => 'NOT IN'
                ),
                // 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');

Tal vez sea útil para alguien por ahí.

¿Ha sido útil esta solución?