Atualmente, estou tentando produzir uma lista de títulos de músicas e gostaria que a classificação ignorasse (mas ainda seja exibida) o artigo inicial do título.
Por exemplo, se eu tivesse uma lista de bandas, ela será exibida em ordem alfabética no WordPress assim:
- Sábado Negro
- LED Zeppelin
- Pink Floyd
- Os Beatles
- The Kinks
- As pedras rolantes
- Thin Lizzy
Em vez disso, gostaria de exibi-lo em ordem alfabética, ignorando o artigo inicial 'The', assim:
- Os Beatles
- Sábado Negro
- The Kinks
- LED Zeppelin
- Pink Floyd
- As pedras rolantes
- Thin Lizzy
Me deparei com uma solução em uma entrada de blog do ano passado , que sugere o seguinte código em 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;
}
e, em seguida, agrupando a consulta com add_filter
antes e remove_filter
depois.
Eu tentei isso, mas continuo recebendo o seguinte erro no meu site:
Erro no banco de dados do WordPress: [coluna desconhecida 'title2' na 'cláusula de ordem']
SELECT wp_posts. * FROM wp_posts WHERE 1 = 1 AND wp_posts.post_type = 'release' AND (wp_posts.post_status = 'publique' OU wp_posts.post_status = 'private') ORDER BY UPPER (title2) ASC
Não vou mentir, sou muito novo na parte php do WordPress, por isso não sei por que estou recebendo esse erro. Percebo que tem algo a ver com a coluna 'title2', mas entendi que a primeira função deveria cuidar disso. Além disso, se houver uma maneira mais inteligente de fazer isso, sou todo ouvidos. Tenho pesquisado e pesquisado neste site, mas ainda não encontrei muitas soluções.
Meu código usando os filtros fica assim se houver alguma ajuda:
<?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();
?>