wordpress - keywords - meta tags generator
¿Cómo ordenar por múltiples claves meta? (5)
De la documentación de WP_Query , use meta_query
y rellene con una matriz de meta clave / valores:
$args = array(
''post_type'' => ''product'',
''meta_query'' => array(
array(
''key'' => ''color'',
''value'' => ''blue'',
''compare'' => ''NOT LIKE''
),
array(
''key'' => ''price'',
''value'' => array( 20, 100 ),
''type'' => ''numeric'',
''compare'' => ''BETWEEN''
)
)
);
$query = new WP_Query( $args );
Estoy usando un bucle personalizado para mostrar mis eventos en una página, lo ordeno bien para la fecha de inicio del evento usando lo siguiente:
$args = array(
''post_type'' => ''event'',
''order'' => ''ASC'',
''orderby'' => ''meta_value'',
''meta_key'' => ''_event_start_date'');
$loop = new WP_Query( $args );
Pero la opción meta_key solo permite un valor. ¿Cómo usar dos valores ( _event_start_date
y _event_start_time
)?
Esto es algo para lo que WordPress agregó soporte en 4.2: https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/
En tu caso, probablemente querrás hacer algo como esto:
$args = array(
''post_type'' => ''event'',
''meta_query'' => array(
''relation'' => ''AND'',
''event_start_date_clause'' => array(
''key'' => ''_event_start_date'',
''compare'' => ''EXISTS'',
),
''event_start_time_clause'' => array(
''key'' => ''_event_start_time'',
''compare'' => ''EXISTS'',
),
),
''orderby'' => array(
''event_start_date_clause'' => ''ASC'',
''event_start_time_clause'' => ''ASC'',
),
);
$loop = new WP_Query( $args );
Puede ordenar en una sola tecla, de múltiples. Al igual que:
$events = get_posts(array(
''post_type'' => ''my_event'',
''post_status'' => ''publish'',
''meta_query'' => array(
array(
''key'' => ''my_event_type'',
''value'' => ''aGoodOne''
),
array(
''key'' => ''my_event_start'',
''value'' => time(), // in this case, only grabbing upcoming events
''compare''=> ''>'',
''type'' => ''NUMERIC'' // assuming value is unix timestamp
)
),
''meta_key'' => ''my_event_start'', // we''re sorting on the start time key
''orderby'' => ''meta_value_num'', // it''s a numeric value
''order'' => ''ASC'' // in chrono order
));
La clave aquí es que meta_key
especifica qué clave estamos ordenando, de las que usamos para obtener nuestros registros con meta_query
.
Tienes que usar meta_query al agregar tus claves de metadatos como todos dicen, pero también tienes que personalizar orden por función.
$args = array(
''post_type'' => ''event'',
''meta_key'' => ''_event_start_date'',
''meta_query'' => array(
array(''key'' => ''_event_start_date''),
array(''key'' => ''_event_start_time'')
),
);
add_filter(''posts_orderby'',''customorderby'');
$loop = new WP_Query( $args );
remove_filter(''posts_orderby'',''customorderby'');
Y pon esto en tus funciones.
function customorderby($orderby) {
return ''mt1.meta_value ASC, mt2.meta_value ASC'';
}
Puede leer más en http://dotnordic.se/sorting-wordpress-posts-by-several-numeric-custom-fields/
add_action( ''pre_get_posts'', ''pre_get_posts_programpunkter'' );
function pre_get_posts_programpunkter( $query ) {
if( !is_admin() && is_post_type_archive( ''programpunkt'' ) && $query->is_main_query() ) {
$query->set( ''orderby'', ''meta_value'' );
$query->set( ''meta_key'', ''event-date'' );
$query->set( ''meta_query'', array(
''relation'' => ''AND'',
array( ''key'' => ''event-date'', ''compare'' => ''EXISTS'' ),
array( ''key'' => ''event-start'', ''compare'' => ''EXISTS'' )
)
);
$query->set( ''order'', ''ASC'' );
}
}
add_filter(''posts_orderby'', ''programpunkter_orderby'');
function programpunkter_orderby( $orderby ) {
if( get_queried_object()->query_var === ''programpunkt'' ) {
global $wpdb;
$orderby = str_replace( $wpdb->prefix.''postmeta.meta_value'', ''mt1.meta_value, mt2.meta_value'', $orderby );
}
return $orderby;
}