Necesito ordenar las publicaciones (personalizadas) por 2 valores de campo personalizados ...
nombre de campo personalizado 1: is_sponsored
[el valor puede ser 1
o 0
]
nombre de campo personalizado 2: sfp_date
[ timestamp
también conocida como fecha de publicación actual en segundos]
Las publicaciones cuyo " is_sponsored
" valor es 1 deben estar en la parte superior, ordenadas por " sfp_date
" en DESC
orden final. Todas las demás publicaciones cuyo " is_sponsored
" valor es 0 deben aparecer a continuación, en orden descendente (por " sfp_date
") también.
Tengo algo como:
$sfp_query_args = array(
'tax_query' => array(
array(
'taxonomy' => 'sfp_posts',
'terms' => array( 1, 5, 8 )
)
),
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => 15,
'paged' => $paged,
'meta_key' => 'sfp_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_query' => array(
'key' => 'is_sponsored',
'value' => 2,
'type' => 'NUMERIC',
'compare' => '<='
)
);
$wp_q = new WP_Query( $sfp_query_args );
... pero no funciona. ¿Algunas ideas?
Nota del editor: este es un pequeño complemento que debe mostrar cómo se ve la consulta, ya que es probable que no tengamos ningún conjunto de datos disponible para probar esto.
<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
echo '<pre>'.var_export( $pieces, true ).'</pre>';
return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );
OP POR FAVOR AGREGUE LA SALIDA DEL PLUGIN AQUÍ - use el enlace "editar" .
EDITAR por Dameer
De acuerdo, después de la solicitud de rastreo y numerosas soluciones, se me ocurrió lo siguiente ...
Si simplifico un poco "$ sfp_query_args", el resultado está cerca de lo que se requiere, sin embargo, la incapacidad para ordenar las publicaciones permanece como está. Aquí está:
$sfp_query_args1 = array(
'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => (int)$per_page,
'paged' => $paged,
'meta_key' => 'is_sponsored',
'orderby' => 'meta_value date'
);
- * orderby toma dos atributos: meta_value y date *
Entonces $ wpdb-> request con los argumentos anteriores en la consulta se ve así:
SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID
FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->postmeta
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE 1=1
AND $wpdb->posts.post_type = 'sfpposts'
AND ($wpdb->posts.post_status = 'publish')
AND ($wpdb->postmeta.meta_key = 'is_sponsored' )
GROUP BY $wpdb->posts.ID
ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC
LIMIT 0, $per_page
Y finalmente, para poder ordenar también por meta_valor, la consulta debe establecerse con solo una pequeña diferencia:
SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID
FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->postmeta
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE 1=1
AND $wpdb->posts.post_type = 'sfpposts'
AND ($wpdb->posts.post_status = 'publish')
AND ($wpdb->postmeta.meta_key = 'is_sponsored' )
GROUP BY $wpdb->posts.ID
ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC
LIMIT 0, $per_page
Por favor, identifique el marcador de posición [! ORDER MISSING!]. Supongo que lo anterior debería explicar dónde ocurre exactamente el problema.
fuente
Respuestas:
OK, la solución final sería dividir la consulta:
... y use el filtro "posts_orderby" para modificar la parte ORDER:
Lo más probable es que necesite eliminar el filtro después del bucle en la página para evitar que 'posts_orderby' afecte a cualquier otra consulta (barra lateral o pie de página). Así que aquí hay otra función para poner en "functions.php":
... y en la página usando nuestro filtro de descarte de consultas:
¡Ojalá tenga sentido!
fuente
Estoy escribiendo su consulta modificando ligeramente. Espero que pueda ayudar.
Por favor, avíseme si funciona o no :-)
fuente