Что я хочу сделать:
Настройка WP_Query
пагинации в одном файле шаблона custom-post-type.php
Что я наделал
1) Создан тип поста под названием «авторы». Каждый пост в этом типе поста является отдельным автором.
2) Стандартные страницы экрана редактирования постов содержат выпадающий список, в котором перечислены все посты (авторы) от автора тип поста.
3) Создал шаблон single -hors.php, который запрашивает все сообщения с метаданными автора из выпадающего списка, поэтому в результате получается список сообщений, которым назначен один и тот же автор (вроде архива):
<?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();
?>
На чем я застрял
Ссылки на страницы не отображаются. Я провел некоторое исследование и обнаружил, что они используют $wp_query
переменную, однако, когда я изменил свою переменную запроса на $wp_query
, появились ссылки, но при нажатии ничего не произошло.
Есть идеи, где я иду не так?
Редактировать:
Чтобы ответить на некоторые ваши вопросы, мой запрос успешно выводит сообщения, которые я запрашиваю, $ author_id уже имеет значение, которое я не включил в этот фрагмент кода. Точно так же я пропустил фактический вывод содержимого в цикле while, потому что эта часть не является проблемой. Проблема в том, что мне нужно разбить содержимое уже существующего на этот пост.
Цель этой функциональности состояла в том, чтобы позволить постам иметь собственных авторов (вне встроенной системы Users), и целью этого шаблона является вывод всех постов для данного автора (который уже работает).
the_title()
'meta_value' => $author_id
заполняется из выпадающего списка упоминается? И при выборе каждого автора через выпадающий список правильно отображаются первые десять сообщений?$author_query->have_posts()
возвращаетсяtrue
и что на$author_query
самом деле содержит какие-либо сообщения?Ответы:
У вас 2 проблемы.
Первая проблема
Линия
потерпит неудачу, потому что в единственном представлении поста, когда URL содержит
'/page/XX/'
, переменная WordPress устанавливает,'page'
а не'paged'
.Вы можете подумать о том, чтобы использовать
'page'
вместо'paged'
, но это тоже не сработает, потому что, как только'page'
переменная предназначена для использования в многостраничной отдельной публикации (с использованием разделения страниц<!--nextpage-->
), и когда публикация не многостраничная, WordPress перенаправит запрос. на URL без'/page/XX/'
.Это то, что происходит, когда вы называете свою переменную запроса
$wp_query
.Решение состоит в том, чтобы предотвратить это перенаправление путем удаления ответственной за него функции, которая
'redirect_canonical'
подключается к'template_redirect'
:Итак, в вашем
functions.php
добавлении:Теперь WordPress больше не будет перенаправлять и правильно установит
'paged'
запрос var.Вторая проблема
next_posts_link()
иprevious_posts_link()
обе проверкиif ( ! is_single() )
для отображения нумерации страниц.Теперь
is_single()
верно в вашем случае, потому что вы находитесь в одном посте типа «автор», поэтому эти функции не могут работать так, как вы ожидаете.У вас есть 3 возможности:
query_posts
для переопределения основного запроса (на самом деле не рекомендуется)is_single()
это ложно для страниц, и ваш код будет работать там.Это код для решения № 3:
и используйте это так в
single-authors.php
:источник
the_posts_pagination
но мне пришлось взять копию оригинального wp_query, как указано в этом вопросе: wordpress.stackexchange.com/questions/216821/…Основываясь на другом подобном вопросе WPSE « Разбиение на страницы не работает значения пользовательских полей wp_query », я бы предложил добавить
global $paged;
в начало вашего файла шаблона:источник
$GLOBALS['paged'] = get_query_var( 'paged' );
. Остальное просто используй контент globals.$author_query
на,$wp_query
и это, казалось, делало нумерацию страниц, но когда я нажимаю на нее, страница обновляется и фактически не переходит на следующую страницу, даже если есть несколько страниц. Я обновил свой ответ, чтобы отразить эти изменения.global
и$GLOBALS
. Немногоvar_dump()
, некоторые функции, и вы в порядке. Чтобы действительно понять это с небольшим количеством попытки / ошибки, вы прибл. нужно полчаса. Это поможет вам лучше понять функции и классы, а также подход ООП в целом. И это явно приблизит вас к пониманию пространств имен :)