detener la búsqueda de wordpress mostrando un tipo de publicación personalizada

7 minutos de lectura

Tengo un tipo de publicación personalizada que uso para algunos bloques de texto en una página creada con el tema de descodificación. Necesito que estos bloques sean públicos para que se muestren en la página, pero quiero que dejen de aparecer en los resultados de búsqueda.

El search.php no es como un archivo de búsqueda de wordpress normal, es el archivo de tema de descodificación y no tiene consultas normales en No creo, así que creo que necesito una función, ¿quizás?

¿Alguien puede aconsejarme cómo lograr esto?

El CPT es ‘contenido estático’

¡Gracias!

avatar de usuario
greg burkett

La respuesta aquí depende de si está creando el CPT a través de su propio código o si otro complemento está creando el CPT. Vea este enlace para una gran explicación de ambos enfoques:

http://www.webtipblog.com/exclude-custom-post-type-search-wordpress/

La esencia básica es esta:

Si está creando su propio CPT, puede agregar un argumento a la llamada register_post_type() de 'exclude_from_search' => true

Si otro complemento/tema está creando el CPT, debe configurar esta variable excluir_de_búsqueda más adelante, como parte de un filtro para el CPT, como tal:

// functions.php

add_action( 'init', 'update_my_custom_type', 99 );

function update_my_custom_type() {
    global $wp_post_types;

    if ( post_type_exists( 'staticcontent' ) ) {

        // exclude from search results
        $wp_post_types['staticcontent']->exclude_from_search = true;
    }
}

  • Mi palabra, tan simple gracias!! Yo mismo registré el CPT, así que agregué ‘exclude_from_search’ => true

    – igloobob

    3 oct 2016 a las 20:04


  • Así que acabo de notar que agregar esa línea de exclusión_de_búsqueda en realidad detiene el bloque de contenido que se muestra en la página donde debería estar. Desaparece. Quiero que el CPT aparezca en la página pero no en una búsqueda. es posible?

    – igloobob

    3 oct 2016 a las 23:52

  • Hmm… eso es extraño, ciertamente no debería hacer eso. ¿Olvidaste la coma al final de la línea de ‘exclude_from_search’ => true, en tu matriz de argumentos? Si elimina por completo esa línea de los argumentos de CPT, ¿vuelve el contenido?

    – Greg Burkett

    4 de octubre de 2016 a las 2:26

  • Hola Greg, no, no había omitido la coma, solo verifiqué dos veces. El contenido vuelve cuando elimino la línea de exclusión.

    – igloobob

    5 de octubre de 2016 a las 9:02

  • ¡Advertencia! Esta respuesta aceptada tiene un efecto secundario: también hace que la paginación no esté disponible en las taxonomías que contienen el tipo de publicación que se excluyó de la búsqueda. Aquí algunos detalles más stackoverflow.com/questions/8269713/…

    – Yuri

    15/10/2021 a las 20:10

No creo que la respuesta aceptada sea correcta. exclude_from_search previene todo $query = new WP_Query de devolver los resultados.

El núcleo dice:

… recupera cualquier tipo excepto revisiones y tipos con ‘exclude_from_search’ establecido en TRUE)

Este es un problema común y una confusión con el página de resultados de búsqueda frontal vs buscar publicaciones en la base de datos.

Presentar contenido usando consultas personalizadas en el front-end, necesidades exclude_from_search = false o use otro enfoque y obtenga el contenido por id directamente.

En su lugar, debe filtrar el mecanismo frontal de búsqueda. Esto es un verdadero Excluir tipos de publicaciones de la búsqueda, sin reconstruir manualmente los tipos “conocidos”:

function entex_fn_remove_post_type_from_search_results($query){

    /* check is front end main loop content */
    if(is_admin() || !$query->is_main_query()) return;

    /* check is search result query */
    if($query->is_search()){

        $post_type_to_remove="staticcontent";
        /* get all searchable post types */
        $searchable_post_types = get_post_types(array('exclude_from_search' => false));

        /* make sure you got the proper results, and that your post type is in the results */
        if(is_array($searchable_post_types) && in_array($post_type_to_remove, $searchable_post_types)){
            /* remove the post type from the array */
            unset( $searchable_post_types[ $post_type_to_remove ] );
            /* set the query to the remaining searchable post types */
            $query->set('post_type', $searchable_post_types);
        }
    }
}
add_action('pre_get_posts', 'entex_fn_remove_post_type_from_search_results');

y comentar $post_type_to_remove="staticcontent"; se puede cambiar para adaptarse a cualquier otro tipo de publicación.

Por favor haz un comentario si me estoy perdiendo algo aquí, no puedo encontrar otra forma de evitar escenarios de tipo de publicación como este, mostrando contenido por consulta pero ocultar de la búsqueda/acceso directo a los usuarios finales.

  • Comparto tu opinión.

    –Uwe Schmelzer

    18/09/2018 a las 22:39

  • De acuerdo con esta página del códice, include_from_search es para resultados de búsqueda de frontend. Pero tiene alguna nota.codex.wordpress.org/Function_Reference/register_post_type excluir_de_búsqueda (booleano) (importancia) Si se excluyen las publicaciones con este tipo de publicación de los resultados de búsqueda de front-end.

    – Iggy

    30 de junio de 2019 a las 13:15

  • Siento que esto debería indicarse explícitamente para los futuros usuarios de Google (como yo): esta técnica es probablemente lo que desea en lugar de la respuesta aceptada. Usando 'exclude_from_search' => true en la configuración de CPT (según lo recomendado por la respuesta aceptada) también eliminará las publicaciones de los archivos de taxonomía, que probablemente no sea lo que quieres. Acabo de experimentar esto yo mismo (WP 5.3.2), y puede ver que OP también lo experimentó en los comentarios de la respuesta aceptada. Use el enfoque en esta respuesta si solo desea afectar la página de resultados de búsqueda.

    –Ian Drake

    13 de abril de 2020 a las 4:51


  • Probé la respuesta aceptada pero también eliminó las publicaciones de las páginas de archivo. Entonces, creo que la respuesta aceptada no es correcta. Me pregunto por qué tiene tantos votos a favor. Esta respuesta funcionó para mí. Simplemente copie el código en functions.php y reemplace la palabra ‘staticcontent’ con el tipo de publicación que desee.

    –Davood Kazemi

    5 de junio de 2021 a las 13:10

  • Esta es la mejor solución y funciona, ya que la respuesta aceptada tiene un efecto secundario: también hace que la paginación no esté disponible en las taxonomías que contienen el tipo de publicación que se excluyó de la búsqueda. Aquí algunos detalles más stackoverflow.com/questions/8269713/…

    – Yuri

    15 oct 2021 a las 20:09


En primer lugar, la respuesta de jonas lundman es correcta y debería ser la respuesta aceptada.

los exclude_from_search El parámetro funciona incorrectamente: también excluye el tipo de publicación de otras consultas.

Hay un ticket en el sistema de seguimiento de problemas de WP, pero lo cerraron porque no pueden solucionarlo sin romper la compatibilidad con versiones anteriores. Ver este boleto y Éste para más detalles.

He añadido comprobaciones adicionales a la solución propuesta por jonas lundmanporque:

  • en configuraciones reales, puede haber otros complementos que intenten modificar la consulta de búsqueda, por lo que simplemente reemplace el post_type puede causar resultados inesperados.
  • Creo que es más flexible usar una variedad de tipos de publicaciones para excluir.
add_action('pre_get_posts', 'remove_my_cpt_from_search_results');

function remove_my_cpt_from_search_results($query) {
    if (is_admin() || !$query->is_main_query() || !$query->is_search()) {
        return $query;
    }

    // can exclude multiple post types, for ex. array('staticcontent', 'cpt2', 'cpt3')
    $post_types_to_exclude = array('staticcontent');

    if ($query->get('post_type')) {
        $query_post_types = $query->get('post_type');

        if (is_string($query_post_types)) {
            $query_post_types = explode(',', $query_post_types);
        }
    } else {
        $query_post_types = get_post_types(array('exclude_from_search' => false));
    }

    if (sizeof(array_intersect($query_post_types, $post_types_to_exclude))) {
        $query->set('post_type', array_diff($query_post_types, $post_types_to_exclude));
    }

    return $query;
}

  • Esta es la única respuesta que funcionó para mí.

    – Daniel Muñoz Parsapoormoghadam

    31 de diciembre de 2021 a las 15:40

¿Ha sido útil esta solución?