Soporte » WordPress Avanzado » Error en segundo filtrado en listado de Custom Post Type

  • Resuelto barondelab

    (@barondelab)


    Situación:

    He creado un CPT con categorías y etiquetas genéricas.

    Añado el CPT al loop dentro del functions.php. Para que muestra el listado en varios puntos (Listados y carruseles)

    En el dashboard al ver el listado del custom post type creado al filtrar por categoría, etiqueta o realizando una búsqueda
    lo muestra correctamente.
    El problema aparece si realizo una de esas tres acciones por segunda vez me muestra pantalla blanca con el mensaje:

    Tipo de contenido no disponible o Invalid post type

    Volviendo el listado de CPT en la barra izquierda del escritorio, se recarga y no da problema

    Este es el código del loop.

    add_filter( ‘pre_get_posts’, ‘add_cpt_to_loop’ );
    function add_cpt_to_loop( $query ) {
    
    if ( is_category() || is_tag() && empty( $query->query_vars[‘suppress_filters’] ) ) {
    
    $post_types = get_post_types();
    
    $query->set( ‘post_type’, $post_types );
    $query->set( ‘orderby’, ‘menu_order’ );
    $query->set( ‘order’, ‘DESC’ );
    return $query;
    
    }
    }

    Si me podéis dar algún tipo de luz estaré muy agradecido.

    • Este debate fue modificado hace 3 meses, 1 semana por  barondelab.
    • Este debate fue modificado hace 3 meses, 1 semana por  almendron.
Viendo 2 respuestas - 1 de 2 (de 2 total)
  • Hola @barondelab

    Te comento:
    $query se pasa por referencia y por lo tanto no es necesario ese return.
    Despues veo que lo aplicas a todo, y es un grandisimo error ya que modificas todas las queries que haga el WordPress.
    Por lo que comentas lo usas tanto en el FrontEnd como en Backend asi que te recomiendo que lo hagas mas estricto.
    Usando los actions como load-edit.php para admin y comprobando que estas en el listado del cpt para modificar la query, en el FrontEnd ya seria ver donde lo muestras para determinar que action seria mejor.

    Hola @kallookoo

    Después de ver el problema sin prisas y «agobios», he eliminado el return innecesario.
    Debido a que estamos metiéndole mano al código 3 personas, no «puedo» sacarlo del functions.php.
    En un futuro lo depurare con tranquilidad.
    Lo unico que hice para salvar el problema fue añadir
    if( !is_admin() )

    Quedando así:

    add_filter( ‘pre_get_posts’, ‘add_cpt_to_loop’ );
    function add_cpt_to_loop( $query ) {
    
    if (!is_admin() &&(is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) )) {
    
    $post_types = get_post_types();
    
    $query->set( ‘post_type’, $post_types );
    $query->set( ‘orderby’, ‘menu_order’ );
    $query->set( ‘order’, ‘DESC’ );
    }
    }

    Se que no ha quedado nada limpio, pero le soluciona el problema al cliente.

    Muchas gracias por darme la idea de bloquear en el backend

    • Esta respuesta fue modificada hace 2 meses, 3 semanas por  barondelab.
Viendo 2 respuestas - 1 de 2 (de 2 total)
  • Debes estar registrado para responder a este tema.