Saltar al contenido

Wordpress: ¿devuelve la publicación principal con sus hijos usando WP_Query?

Luego de consultar con expertos en este tema, programadores de varias áreas y profesores dimos con la respuesta a la pregunta y la plasmamos en este post.

Solución:

Si todo lo que desea son los resultados de la "página" post_type, haga lo que sugirió @birgire.

Alternativamente, puede adaptar lo siguiente para obtener un resultado similar no solo para el pagepost_type pero cualquier tipo de publicación personalizada.

$parent = 2;      //change as desired
$type   = 'page'; //change as desired

$child_args = array( 
    'post_type'   => $type, 
    'post_parent' => $parent 
);

$ids = array($parent);
$ids = array_merge($keys, array_keys( get_children( $child_args ) ));

$query = new WP_Query( 
    array( 
        'post_type'      => 'page', 
        'post_status'    => 'publish', 
        'post__in'       => $ids, 
        'posts_per_page' => -1 
    ) 
);

Lo anterior es esencialmente lo mismo que engancharse en el posts_where filtrar y analizar la cláusula SQL sin embargo, esto logra exactamente lo mismo.

Podemos filtrar la posts_where cláusula del SQL generado para devolver también la publicación/página principal y no solo los hijos de los padres. Aquí estableceremos nuestro propio argumento personalizado llamado wpse_include_parentque, cuando se establece en truemodificará el SQL generado en consecuencia.

Todo lo que tenemos que hacer dentro de nuestro posts_where El filtro es verificar si nuestro argumento personalizado está configurado y si el post_parent se establece el argumento. Luego obtenemos ese valor y lo pasamos al filtro para extender nuestra consulta SQL. Lo que es bueno aquí, post_parent excepto un valor entero único, por lo que solo necesitamos validar el valor como un número entero.

LA CONSULTA

$args = [
    'wpse_include_parent' => true,
    'post_parent'         => 256,
    'post_type'           => 'page'
    // Add additional arguments
];
$q = new WP_Query( $args );

Como puede ver, hemos establecido 'wpse_include_parent' => true para "activar" nuestro filtro.

EL FILTRO

add_filter( 'posts_where', function ( $where, WP_Query $q ) use ( &$wpdb )

    if ( true !== $q->get( 'wpse_include_parent' ) )
        return $where;

    /**
     * Get the value passed to from the post parent and validate it
     * post_parent only accepts an integer value, so we only need to validate
     * the value as an integer
     */
    $post_parent = filter_var( $q->get( 'post_parent' ), FILTER_VALIDATE_INT );
    if ( !$post_parent )
        return $where;

    /** 
     * Lets also include the parent in our query
     *
     * Because we have already validated the $post_parent value, we 
     * do not need to use the prepare() method here
     */
    $where .= " OR $wpdb->posts.ID = $post_parent";

    return $where;
, 10, 2 );

Puede extender esto según lo necesite y lo considere adecuado, pero esta es la idea básica. Esto devolverá el padre pasado a post_parent y son niños

Calificaciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.