Orden de archivos de WP por clave meta personalizada

3 minutos de lectura

avatar de usuario
eapo

en la plantilla de WordPress función.php siguiente código está funcionando bien

// Function accepting current query
function my_change_order( $query ) {
    // Check if the query is for an archive
    if($query->is_archive())
        // Query was for archive, then set order
        $query->set( 'order' , 'asc' );
    // Return the query (else there's no more query, oops!)
    return $query;
}
// Runs before the posts are fetched
add_filter( 'pre_get_posts' , 'my_change_order' );

Pero necesito ordenar artículos por clave meta personalizada como _my_meta_vip. Basado en esta respuesta, intenté seguir las líneas, con la mitad de éxito, porque solo carga artículos con meta clave personalizada definida, faltan otros. ¿Cómo puedo solucionar eso?

function my_change_order( $query ) {
    if($query->is_archive())
        $query->set( 'orderby' , 'meta_value' );
        $query->set( 'meta_key' , '_my_meta_vip' );
    return $query;
}
add_filter( 'pre_get_posts' , 'my_change_order' );

¿Cómo puedo ordenar correctamente mis artículos por clave meta personalizada?

avatar de usuario
joyahuq

   function my_change_order( $query ) {
        // Check if the query is for an archive
        if($query->is_archive())
        // Query was for archive, then set order
        $query->set( 'order' , 'asc' );
        $query->set( 'meta_query', array(
            array(
              'key' => '_my_meta_vip'
            )
        ));

        // Return the query (else there's no more query, oops!)
        return $query;
    }

mira el siguiente tema: https://wordpress.stackexchange.com/questions/20237/using-meta-query-how-can-i-filter-by-a-custom-field-and-order-by-other-one te puede dar una idea clara

  • No puedo ver la diferencia y hacer lo mismo que mi código. 🙁

    – eapo

    22 mayo 2015 a las 19:34

  • ver meta_query es enviar es asignar y enviar a través de matriz

    – jewelhuq

    23 mayo 2015 a las 16:13

  • todavía no muestra publicaciones sin _my_meta_vip definido.

    – eapo

    26 de mayo de 2015 a las 7:56

Finalmente, no puedo encontrar ninguna forma de enumerar todas las publicaciones con y sin _my_meta_VIP definido.

En mi solución todo _my_meta_VIP estaba lleno de enabled o disabled y el siguiente código hace el trabajo:

    // Function accepting current query
    function my_change_order( $query ) {
        // Check if the query is for an archive
        if($query->is_archive()) {
            // Query was for archive, then set order
            $query->set( 'post_type', 'profile' );
            $query->set( 'orderby' , 'meta_value' );
            $query->set( 'meta_key' , '_my_meta_vip' );
            $query->set( 'order', 'DESC' );
        } else {
            // Return the original query for non-archive pages
            return $query;
        }
        // Return the query
        return $query;
    }
    // Runs before the posts are fetched
    add_filter( 'pre_get_posts' , 'my_change_order' );

avatar de usuario
Mateo Tinsley

Parece que el problema subyacente aquí es que la consulta está realizando una unión interna en las publicaciones y las metatablas posteriores, por lo que la consulta no devuelve las publicaciones que no tienen esa metaentrada de publicación en particular. Lo que quieres es una combinación izquierda. Consulte esta respuesta para obtener una explicación de la diferencia.

Deberías poder usar el posts_join filter para reemplazar la combinación interna con una combinación izquierda:

add_filter('posts_join', function($join) {
    global $wpdb;

    // Replace inner join with left join
    $search="INNER JOIN " . $wpdb->postmeta;
    $replace="LEFT JOIN " . $wpdb->postmeta;
    $join = str_ireplace($search, $replace, $join);

    return $join;
});

¿Ha sido útil esta solución?