Agregar tipo de publicación personalizada a la consulta actual

4

Estoy intentando crear un complemento que agregue un nuevo tipo de publicación personalizada y debería mostrarse en las mismas ubicaciones que una publicación normal (página principal, archivos, etc.).

¿Hay alguna función para que recupere los tipos de publicación a los que se está llamando actualmente en la consulta para que pueda modificar y agregar mi CPT a la consulta actual? (ejemplo indicado en el segundo comentario si mi pregunta parece confusa)

No puedo usar el siguiente código (es decir, enumerar los tipos de publicaciones) porque no puedo predecir qué tipos de publicaciones tendría el usuario:

add_filter( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {

if ( is_home() && $query->is_main_query() )
    $query->set( 'post_type', array( 'post', 'page', 'album', 'movie', 'quote' ) );

return $query;
}

Del mismo modo, no puedo usar el código a continuación porque devolvería todos tipos de publicación, incluidos aquellos que podrían no aparecer en la página principal:

if ( !is_admin() && empty( $query->query_vars['suppress_filters'] ) && $query->is_main_query() ) {
    $post_type = get_query_var('post_type');
    $post_types = get_post_types( array( 'public' => true ) );

    if ($post_type) {
        $post_type = $post_type;
    } else {
        $post_type = $post_types;
    }

    $query->set('post_type',$post_type);
    return $query;
    }
}

Entonces, ¿hay alguna idea de cómo puedo agregar mi CPT a la consulta sin afectar a otros tipos de publicaciones? ¡Gracias por ayudar!

    
pregunta Billy 24.12.2014 - 10:26

1 respuesta

4

En realidad, no estás tan lejos con pre_get_posts , solo necesitas capturar los tipos de publicaciones actuales que se encuentran en la consulta antes de agregar las tuyas.

También, recomiendo usar un $priority de 99 para que la acción se enganche después de cualquier otro pre_get_posts enganche, lo que significa que si los usuarios agregan sus propios CPT (o tipos de mensajes integrados) se detectan e incluido por la función a continuación (pero puede cambiarlo según sea necesario).

add_action('pre_get_posts', 'djg_includ_my_cpt_in_query', 99);
function djg_includ_my_cpt_in_query($query){

    if(is_home() && $query->is_main_query()) :              // Ensure you only alter your desired query

        $post_types = $query->get('post_type');             // Get the currnet post types in the query

        if(!is_array($post_types) && !empty($post_types))   // Check that the current posts types are stored as an array
            $post_types = explode(',', $post_types);

        if(empty($post_types))                              // If there are no post types defined, be sure to include posts so that they are not ignored
            $post_types[] = 'post';         
        $post_types[] = 'document';                         // Add your custom post type

        $post_types = array_map('trim', $post_types);       // Trim every element, just in case
        $post_types = array_filter($post_types);            // Remove any empty elements, just in case

        $query->set('post_type', $post_types);              // Add the updated list of post types to your query

    endif; 

    return $query;

}

EDITAR

Al construir la consulta final, WordPress verifica si 'post_type' está vacío, y si es así, se ejecuta el siguiente código -

$where .= " AND $wpdb->posts.post_type = 'post'";
$post_type_object = get_post_type_object ( 'post' );

Entonces, lo que sucede cuando agregamos un CPT es que WordPress asume que queremos ignorar las publicaciones, ya que no se declara explícitamente. Es decir, mi situación fue diferente: anteriormente había declarado explícitamente otros tipos de publicaciones, por lo que se incluyeron en la llamada $post_types = $query->get('post_type'); .

Entonces, en su caso, podemos resumir razonablemente que si $post_types está vacío, el usuario no desea enmendar esa parte de la consulta, por lo que 'post' se puede agregar manualmente a la matriz $post_types . Esto debería (¡con suerte!) Hacer el truco.

    
respondido por el David Gard 24.12.2014 - 12:03

Lea otras preguntas en las etiquetas