Actualmente estoy intentando 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 como este:
- Black Sabbath
- Led Zeppelin
- Pink Floyd
- Los Beatles
- The Kinks
- Los Rolling Stones
- Thin Lizzy
En su lugar, me gustaría que se muestre en orden alfabético e ignore el artículo inicial 'El', como este:
- Los Beatles
- Black Sabbath
- The Kinks
- Led Zeppelin
- Pink Floyd
- Los Rolling Stones
- Thin Lizzy
Encontré una solución en una entrada de blog del año pasado , que sugiere la 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 envuelve la consulta con add_filter
antes y remove_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 'title2' en 'cláusula de orden']
SELECCIONE wp_posts. * FROM wp_posts WHERE 1 = 1 AND wp_posts.post_type = 'release' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDEN POR SUPERIOR (title2) ASC
No voy a mentir, soy bastante nuevo en la parte de 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 encargarse de eso. Además, si hay una forma más inteligente de hacerlo, soy todo oídos. He estado buscando en Google y buscando en este sitio, pero realmente no he encontrado muchas soluciones.
Mi código que usa 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();
?>