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();
?>
Respostas:
O problema
Eu acho que há um erro de digitação lá:
O nome do filtro
posts_fields
não épost_fields
.Isso poderia explicar por que o
title2
campo é desconhecido, porque sua definição não é adicionada à sequência SQL gerada.Alternativa - filtro único
Podemos reescrevê-lo para usar apenas um único filtro:
onde agora você pode ativar a ordem personalizada com o
_custom
parâmetro orderby:Alternativa - Recursiva
TRIM()
Vamos implementar a idéia recursiva de Pascal Birchler , comentada aqui :
onde podemos, por exemplo, construir a função recursiva como:
Isso significa que
irá gerar:
Alternativa - MariaDB
Em geral, eu gosto de usar o MariaDB em vez do MySQL . Então é muito mais fácil, porque o MariaDB 10.0.5 suporta
REGEXP_REPLACE
:fonte
functions.php
e chamá-loorderby
quando precisar. Grande solução - obrigado :-)Uma maneira mais fácil pode ser percorrer e alterar a lesma do permalink nas postagens que precisam dela (abaixo do título na tela de redação da postagem) e depois usá-la para fazer pedidos em vez do título.
ie use
post_name
nãopost_title
para classificar ...Isso também significa que seu link permanente pode ser diferente se você usar% postname% em sua estrutura de link permanente, o que pode ser um bônus adicional.
por exemplo.
http://example.com/rolling-stones/
não dáhttp://example.com/the-rolling-stones/
EDIT : código para atualizar as lesmas existentes, removendo os prefixos indesejados da
post_name
coluna ...fonte
EDITAR
Eu melhorei um pouco o código. Todo o bloco de código é atualizado de acordo. Apenas uma observação: antes de pular para as atualizações da RESPOSTA ORIGINAL , configurei o código para trabalhar com os seguintes
Tipo de postagem personalizada ->
release
Taxonomia personalizada ->
game
Certifique-se de definir isso de acordo com suas necessidades
RESPOSTA ORIGINAL
Além das outras respostas e do erro de digitação apontado por @birgire, aqui está outra abordagem.
Primeiro, definiremos o título como um campo personalizado oculto, mas primeiro removeremos as palavras
the
que gostaríamos de excluir. Antes de fazer isso, precisamos primeiro criar uma função auxiliar para remover as palavras proibidas dos nomes de termo e postar títulosAgora que abordamos isso, vamos analisar o trecho de código para definir nosso campo personalizado. Você deve remover esse código completamente assim que carregar qualquer página uma vez. Se você tiver um site enorme com várias postagens, poderá definir
posts_per_page
algo para100
executar os scripts algumas vezes até que todas as postagens tenham o campo personalizado definido para todas as postagensAgora que os campos personalizados estão definidos para todas as postagens e o código acima foi removido, precisamos garantir que definimos esse campo personalizado para todas as novas postagens ou sempre que atualizarmos o título da postagem. Para isso, usaremos o
transition_post_status
gancho. O código a seguir pode entrar em um plug-in ( que eu recomendo ) ou no seufunctions.php
Consultando seus posts
Você pode executar suas consultas normalmente sem nenhum filtro personalizado. Você pode consultar e classificar suas postagens da seguinte maneira
fonte
As respostas da birgire funcionam bem ao fazer pedidos somente por esse campo. Fiz algumas modificações para fazê-lo funcionar ao fazer o pedido por vários campos (não tenho certeza de que funcione corretamente quando o pedido do título for o principal):
fonte