Co chcę zrobić:
Skonfiguruj WP_Query
paginację w pliku szablonu single-custom-post-type.php
Co zrobiłem
1) Utworzono typ postu o nazwie „autorzy”. Każdy post w ramach tego typu postów jest indywidualnym autorem.
2) Standardowe strony ekranu edycji postów zawierają menu rozwijane, które zawiera listę wszystkich postów (autorów) z niestandardowego typu postów autorów.
3) Utworzono szablon single-author.php, który wyszukuje wszystkie posty za pomocą metadanych autora z menu rozwijanego, więc wynikiem jest lista postów, do których przypisano tego samego autora (coś w rodzaju archiwum):
<?php
// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;
/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
$paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
$paged = get_query_var( 'page' );
} else {
$paged = 1;
}
$args = array(
'posts_per_page' => 10,
'meta_key' => 'author_select',
'meta_value' => $author_id,
'paged' => $paged,
);
$temp = $wp_query;
$wp_query = NULL;
$wp_query = new WP_Query($args);
?>
<?php if( $wp_query->have_posts() ) : ?>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>
<?php endwhile; ?>
<div class="single_navigation">
<?php if( get_adjacent_post( false, '', true ) ) { ?>
<span class="prev"><?php previous_post_link( '< %link' ) ?></span>
<?php } ?>
<?php if( get_adjacent_post( false, '', false ) ) { ?>
<span class="next"><?php next_post_link( '%link >' ) ?></span>
<?php } ?>
</div><!--/single navigation-->
<?php endif; ?>
<?php
$wp_query = null;
$wp_query = $temp;
wp_reset_query();
?>
Na czym utknąłem
Łącza do stronicowania nie są wyświetlane. Przeprowadziłem badania i odkryłem, że używają tej $wp_query
zmiennej, jednak kiedy zmieniłem zmienną zapytania na $wp_query
, pojawiły się linki, ale po kliknięciu nic nie zrobiłem.
Masz pomysł, gdzie się mylę?
Edytować:
Aby odpowiedzieć na niektóre pytania, moje zapytanie z powodzeniem wyświetla posty, o które pytam, $ autor_id ma już wartość, której nie zawarłem w tym fragmencie kodu. Podobnie pominąłem rzeczywistą treść wyjściową w pętli while, ponieważ ta część nie stanowi problemu. Problem polega na tym, że muszę paginować treść, która już istnieje w tym pojedynczym poście.
Celem tej funkcji było umożliwienie autorom niestandardowych postów (poza wbudowanym systemem użytkowników), a celem tego szablonu jest wyprowadzenie wszystkich postów dla danego autora (który już działa).
the_title()
'meta_value' => $author_id
wspomniano o wypełnianiu listy rozwijanej? A czy podczas wybierania każdego autora za pomocą listy rozwijanej pierwsze dziesięć postów wyświetla się poprawnie?$author_query->have_posts()
zwrotytrue
i że$author_query
faktycznie zawiera jakieś posty?Odpowiedzi:
Masz 2 problemy.
Pierwszy problem
Linia
zawiedzie, ponieważ w pojedynczym widoku postu, gdy adres URL zawiera
'/page/XX/'
, zmienne zestawy WordPress są'page'
i nie są'paged'
.Możesz pomyśleć o użyciu
'page'
zamiast'paged'
, ale to też nie zadziała, ponieważ gdy'page'
zmienna ma być używana do wielostronicowego pojedynczego postu (przy użyciu rozdzielania stron<!--nextpage-->
), a gdy post nie jest wielostronicowy, WordPress przekieruje żądanie na adres URL bez'/page/XX/'
.Tak dzieje się, gdy nazwiesz zmienną zapytania
$wp_query
.Rozwiązaniem jest zapobieganie temu przekierowaniu poprzez usunięcie odpowiedzialnej za to funkcji, która jest
'redirect_canonical'
zaczepiona o'template_redirect'
:Tak więc w swoim
functions.php
dodaniu:Teraz WordPress nie będzie już przekierowywać i ustawi poprawnie
'paged'
zapytanie var.Drugi problem
next_posts_link()
iprevious_posts_link()
oba zaznaczają,if ( ! is_single() )
aby wyświetlić paginację.Tak
is_single()
jest w twoim przypadku, ponieważ jesteś w jednym poście typu „autor”, więc te funkcje nie mogą działać zgodnie z oczekiwaniami.Masz 3 możliwości:
query_posts
zastąpić główny zapytanie (naprawdę nie zalecane)is_single()
jest fałszywy dla stron, a Twój kod będzie tam działał.To jest kod rozwiązania nr 3:
i użyj go w następujący sposób
single-authors.php
:źródło
the_posts_pagination
ale musiałem pobrać kopię oryginalnego wp_query, jak opisano w tym pytaniu: wordpress.stackexchange.com/questions/216821/...Opierając się na innym podobnym pytaniu WPSE „ Nie działa paginacja wartości pól niestandardowych wp_query ”, sugerowałbym dodanie
global $paged;
na początku pliku szablonu:źródło
$GLOBALS['paged'] = get_query_var( 'paged' );
. W przeciwnym razie skorzystaj z treści globalnych.$author_query
na$wp_query
i wydawało się, że pojawia się paginacja, ale kiedy klikam, strona odświeża się i nie przechodzi do następnej strony, mimo że jest wiele stron. Zaktualizowałem swoją odpowiedź, aby odzwierciedlić te zmiany.global
i$GLOBALS
. Trochęvar_dump()
, niektóre funkcje i wszystko w porządku. Aby naprawdę to zrozumieć przy odrobinie prób / błędów, będziesz mieć ok. potrzebuję pół godziny. Pomoże ci to znacznie lepiej zrozumieć funkcje w porównaniu do klas i podejście OOP jako całości. I to wyraźnie przybliży cię do zrozumienia przestrzeni nazw :)