¿Ordenar por valor meta o fecha?

10

Obtuvo un campo personalizado llamado startDate pero solo en algunos eventos. Me preguntaba si no está configurado para una publicación. Podría usar post_date para generar la lista de publicaciones.

// if meta_key _postmeta.startDate isn't set get the rest by posts.post_date

query_posts(
    array(
        array(
            'posts_per_page' => 10,
            'meta_key' => 'startDate',
            'meta_value' => date('Y-m-d'),
            'meta_compare' => '<',
            'orderby' => 'meta_value',
            'order' => 'ASC'
        ), 
        array(
            'meta_key' => 'post_date',
            'meta_value' => date('Y-m-d'),
            'meta_compare' => '<'
        )
    )
);
    
pregunta v3nt 23.03.2011 - 13:40

3 respuestas

11

Si puedes explicarlo en SQL, ¡puedes consultarlo! Hay tres lugares donde queremos cambiar la consulta predeterminada:

SELECT wp_posts.*
FROM wp_posts 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1=1
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish')
    AND wp_postmeta.meta_key = 'startDate'
    AND CAST(wp_postmeta.meta_value AS CHAR) < '2011-03-23'
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC
LIMIT 0, 10
  • La unión debe ser una combinación izquierda
  • La cláusula where
  • El orden

La unión y la cláusula where se agregan a través de the _get_meta_sql() de función . La salida se filtra, por lo que podemos conectarla:

add_filter( 'get_meta_sql', 'wpse12814_get_meta_sql' );
function wpse12814_get_meta_sql( $meta_sql )
{
    // Move the 'meta_key' comparison in the join so it can handle posts without this meta_key
    $meta_sql['join'] = " LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate') ";
    $meta_sql['where'] = " AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '" . date('Y-m-d') . "')";
    return $meta_sql;
}

La cláusula de orden se filtra a través de posts_orderby :

add_filter( 'posts_orderby', 'wpse12814_posts_orderby' );
function wpse12814_posts_orderby( $orderby )
{
    $orderby = 'COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC';
    return $orderby;
}

Esto nos da la siguiente consulta SQL:

SELECT wp_posts.*
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate')
WHERE 1=1
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish')
    AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '2011-03-23')
GROUP BY wp_posts.ID
ORDER BY COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC
LIMIT 0, 10

Recuerde desconectar los filtros después de realizar su consulta, de lo contrario también arruinará otras consultas. Y si es posible usted no debe llame a query_posts() yourself , pero modifique la consulta principal realizada por WordPress al configurar la página.

    
respondido por el Jan Fabry 23.03.2011 - 22:06
0

prueba algo en la línea de:

$postedtime = get_post_meta($post->ID, 'startDate');

if($postedtime != null){
$orderby = $postedtime;

}else{
$orderby = 'date';
}
    
respondido por el Alex Older 23.03.2011 - 16:00
0

Una llamada a una consulta publica solo una consulta, no dos. Entonces, no, no puede hacer que haga dos consultas separadas y luego concatene los resultados.

Recuerda, estás seleccionando un conjunto de publicaciones aquí y luego las estás mostrando. Ese conjunto se selecciona a la vez. Si quieres obtener dos conjuntos de publicaciones separadas y luego combinarlas, entonces eso es algo que tendrás que hacer con get_posts o similar.

    
respondido por el Otto 23.03.2011 - 20:15

Lea otras preguntas en las etiquetas