Eu tenho uma série de postagens ordenadas por um valor meta_key. Eles também podem ser organizados por ordem do menu, se necessário.
Os postar links próxima / prev (gerados por next_post_link
, previous_post_link
ou posts_nav_link
tudo navegar pela cronologia. Embora eu entenda esse comportamento padrão, eu não entendo como mudar isso. Descobri que ele mapeia até adjacent_post_link no link-template.php, mas então começa a parecer bastante codificado.Recomenda-se reescrever isso do zero para substituí-lo ou existe uma solução melhor.
custom-post-types
post-meta
sort
next-post-link
previous-post-link
Jodi Warren
fonte
fonte
Respostas:
Entendendo os internos
A ordem de "classificação" das postagens adjacentes (próximas / anteriores) não é realmente uma "ordem" de classificação. É uma consulta separada em cada solicitação / página, mas classifica a consulta pelo
post_date
- ou pelo pai da postagem, se você tiver uma postagem hierárquica como objeto atualmente exibido.Quando você examina as partes internas de
next_post_link()
, vê que é basicamente um wrapper de API paraadjacent_post_link()
. A função posterior chamaget_adjacent_post()
internamente com o$previous
argumento / sinalizador definidobool(true|false)
para pegar o link de postagem seguinte ou anterior.O que filtrar?
Depois de aprofundar o assunto, você verá que o
get_adjacent_post()
link Origem possui alguns filtros interessantes para sua saída (também conhecido como resultado da consulta): (Nome / Argumentos do Filtro)"get_{$adjacent}_post_join"
"get_{$adjacent}_post_where"
"get_{$adjacent}_post_sort"
Então você pode fazer muito com isso. Isso começa com a filtragem da
WHERE
cláusula, bem como aJOIN
tabela ed e aORDER BY
instruçãoO resultado é armazenado em cache na memória para a solicitação atual, portanto, não adiciona consultas adicionais se você chamar essa função várias vezes em uma única página.
Construção de consulta automática
Como @StephenHarris apontou nos comentários, há uma função principal que pode ser útil ao criar a Consulta SQL:
get_meta_sql()
- Exemplos no Codex . Basicamente, essa função é usada apenas para criar a instrução meta SQL usadaWP_Query
, mas você pode usá-la neste caso (ou em outros) também. O argumento que você coloca nele é uma matriz, exatamente o mesmo que seria adicionado a aWP_Query
.O valor de retorno é uma matriz:
Então você pode usar
$sql['join']
e$sql['where']
no seu retorno de chamada.Dependências a serem lembradas
No seu caso, o mais fácil seria interceptá-lo em um pequeno plugin (mu) ou no arquivo functions.php do seu tema e alterá-lo dependendo da
$adjacent = $previous ? 'previous' : 'next';
variável e da$order = $previous ? 'DESC' : 'ASC';
variável:Os nomes reais do filtro
Portanto, os nomes dos filtros são:
get_previous_post_join
,get_next_post_join
get_previous_post_where
,get_next_post_where
get_previous_post_sort
,get_next_post_sort
Embrulhado como um plugin
... e o retorno de chamada do filtro seria (por exemplo) algo como o seguinte:
fonte
get_meta_sql()
$meta_query
é apenas a matriz para a qual você passariaWP_Query
ometa_query
argumento,: Neste exemplo:$meta_sql = get_meta_sql( $meta_query, 'post', $wpdb->posts, 'ID');
- isso gera a parteJOIN
eWHERE
da consulta que precisaria ser adicionada.A resposta de Kaiser é impressionante e completa, no entanto, apenas alterar a cláusula ORDER BY não é suficiente, a menos que você
menu_order
corresponda à sua ordem cronológica.Não posso me responsabilizar por isso, mas encontrei o seguinte código nesta lista :
Eu modifiquei os nomes das funções para o WP.SE.
Se você alterar apenas a cláusula ORDER BY, a consulta ainda procurará postagens maiores ou menores que a data atual. Se suas postagens não estiverem em ordem cronológica, você não receberá a postagem correta.
Isso altera a cláusula where para procurar postagens onde o menu_ordem é maior ou menor que o menu_ordem da postagem atual, além de modificar a cláusula orderby.
A cláusula orderby também não deve ser codificada para usar DESC, pois será necessário alternar com base no fato de você estar obtendo o link da postagem seguinte ou anterior.
fonte
WHERE
cláusula procura'YYYY-mm-dd HH:mm:ss'
. Se isso não for cumprido, não funcionará. Como o valor não é definido pelo banco de dados, mas pelo aplicativo, você deverá verificar esse formato primeiro ao criar a expressão regular.Tentei me conectar sem sucesso. Pode ser apenas um problema da minha configuração, mas para aqueles que não conseguem fazer o gancho funcionar, aqui está a solução mais simples:
fonte
get_previous_post_where
,get_previous_post_join
eget_previous_post_sort
para jogar bonito com tipos de pós personalizado e ordenação complexo que inclui chaves de meta, eu desisti e usou isso. Obrigado!fonte
Com base na resposta de @Szabolcs Páll, criei essa classe de utilitário com métodos auxiliares para poder obter postagens do tipo por ordem de menu e também a próxima e a publicação anterior por ordem de menu. Além disso, adicionei condições para verificar se a postagem atual é a primeira ou a última postagem para obter a última ou a primeira postagem, respectivamente.
Por exemplo:
A classe completa:
fonte
Acho este pequeno plugin realmente útil: http://wordpress.org/plugins/wp-query-powered-adjacent-post-link/
fonte
Isso funcionou para mim:
Retirado de: https://stackoverflow.com/questions/16495117/how-to-skip-About-links-on-adjacent-posts-in-wordpress
fonte
Eu encontrei uma maneira muito mais fácil de obter uma pós-navegação baseada em meta-chave, sem a necessidade de modificar o functions.php.
Meu exemplo: você tem um products.php e deseja alternar entre produtos. O produto anterior é o próximo mais barato, o próximo produto o próximo mais caro.
Aí vem minha solução para single.php :
fonte
query_posts
quando o codex declara que não deve ser usado.WP_Query
deve ser usado como nas respostas anteriores.