Actualmente estoy tratando de generar una lista de títulos de música y me gustaría que la clasificación ignore (pero aún muestre) el artículo inicial del título.
Por ejemplo, si tuviera una lista de bandas, se mostrará alfabéticamente en WordPress así:
- Sábado negro
- Led Zeppelin
- Pink Floyd
- Los Beatles
- Los torceduras
- Los Rolling Stones
- Delgado lizzy
En cambio, me gustaría que se muestre alfabéticamente mientras se ignora el artículo inicial 'The', así:
- Los Beatles
- Sábado negro
- Los torceduras
- Led Zeppelin
- Pink Floyd
- Los Rolling Stones
- Delgado lizzy
Encontré una solución en una entrada de blog del año pasado , que sugiere el siguiente código en functions.php
:
function wpcf_create_temp_column($fields) {
global $wpdb;
$matches = 'The';
$has_the = " CASE
WHEN $wpdb->posts.post_title regexp( '^($matches)[[:space:]]' )
THEN trim(substr($wpdb->posts.post_title from 4))
ELSE $wpdb->posts.post_title
END AS title2";
if ($has_the) {
$fields .= ( preg_match( '/^(\s+)?,/', $has_the ) ) ? $has_the : ", $has_the";
}
return $fields;
}
function wpcf_sort_by_temp_column ($orderby) {
$custom_orderby = " UPPER(title2) ASC";
if ($custom_orderby) {
$orderby = $custom_orderby;
}
return $orderby;
}
y luego ajustando la consulta con add_filter
antes yremove_filter
después.
He intentado esto, pero sigo recibiendo el siguiente error en mi sitio:
Error de la base de datos de WordPress: [columna desconocida 'título2' en 'cláusula de pedido']
SELECCIONE wp_posts. * DESDE wp_posts DONDE 1 = 1 Y wp_posts.post_type = 'release' AND (wp_posts.post_status = 'publicar' O wp_posts.post_status = 'privado') ORDEN POR SUPERIOR (título2) ASC
No voy a mentir, soy bastante nuevo en la parte php de WordPress, así que no estoy seguro de por qué recibo este error. Puedo ver que tiene algo que ver con la columna 'título2', pero entendí que la primera función debería ocuparse de eso. Además, si hay una forma más inteligente de hacer esto, soy todo oídos. He estado buscando y buscando en este sitio, pero realmente no he encontrado muchas soluciones.
Mi código usando los filtros se ve así si es de alguna ayuda:
<?php
$args_post = array('post_type' => 'release', 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, );
add_filter('post_fields', 'wpcf_create_temp_column'); /* remove initial 'The' from post titles */
add_filter('posts_orderby', 'wpcf_sort_by_temp_column');
$loop = new WP_Query($args_post);
remove_filter('post_fields', 'wpcf_create_temp_column');
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column');
while ($loop->have_posts() ) : $loop->the_post();
?>