Исправление разбиения на страницы с помощью Пользовательского архива таксономии
Я пытался настроить способ написания постов в серии на своем сайте. Идея заключается в том, что каждая запись может принадлежать к другой серии в пользовательской таксономии. Я почти все устроил так, как мне хочется... за одним исключением.
Регистрация таксономии
Эта часть работает. Я вставил следующий код в плагин:
function jdm_build_series_taxonomy() {
$labels = array(
'name' => _x('Series Labels', 'taxonomy general name'),
'singular_name' => _x('Series Label', 'taxonomy singular name'),
'search_items' => __('Search Series Labels'),
'popular_items' => __('Popular Series Labels'),
'all_items' => __('All Series Labels'),
'parent_item' => __('Parent Series Label'),
'parent_item_colon' => __('Parent Series Label:'),
'edit_item' => __('Edit Series Label'),
'update_item' => __('Update Series Label'),
'add_new_item' => __('Add New Series Label'),
'new_item_name' => __('New Series Label Name')
);
register_taxonomy(
'series',
'post',
array(
'hierarchical' => true,
'label' => __('Series'),
'labels' => $labels,
'query_var' => true,
'rewrite' => true
)
);
}
add_action( 'init', 'jdm_build_series_taxonomy', 0 );
Это добавляет "Метки серий" в раскрывающееся меню Сообщений и дает мне поле "Метки серий" на экран редактирования записи. Все работает, и я могу отлично отмечать посты как часть серии. Проблема заключается в следующем разделе...
Перечисление элементов в таксономии
Моя цель состоит в том, чтобы позволить читателям просматривать серию по одному сообщению за раз, начиная с самого старого сообщения и двигаясь вперед в хронологическом порядке. Это отличается от обычной страницы архива, потому что у меня есть 10 сообщений на страницу для моих архивов, но я, очевидно, хочу только одно сообщение на страницу для моей серии архив.
Я создал файл taxonomy-series.php
внутри своего шаблона. И это половина работает. Первая страница будет работать просто отлично - http://localhost/wp/series/my-test-series/
отображает первую статью в серии со ссылкой "Следующая запись" " внизу страницы. Пока все так хорошо...
Но когда вы нажимаете "Следующая запись"" и переходите на следующую страницу (http://localhost/wp/series/my-test-series/page/2/
), это а) неправильная статья и б) неправильный шаблон!
Однако, если я установлю "Страницы блога отображаются не более:" на "1" на странице чтения (обычно устанавливается значение 10) тогда все работает просто отлично. На странице 2 отображается вторая статья, на странице 3 отображается третья и т.д.
Итак... что мне нужно перепроверить, чтобы заставить страницу архива таксономии отображать только одну запись на каждой странице? Я пробовал следующее:
$new_query = wp_parse_args(
$query_string,
array(
'posts_per_page' => 1,
'paged' => $paged
)
);
query_posts($new_query);
И
query_posts($query_string.'&posts_per_page=1&paged='.$paged);
Безрезультатно... идеи? Чаевые? Предложения?
3 answers
Привет @EAMann:
Я съеживаюсь всякий раз, когда мне нужно сделать что-то творческое с URL-адресами в WordPress, поскольку система URL-адресов, на мой взгляд, является самым неэлегантным аспектом WordPress. Я всегда чувствую, что мне приходится бороться с WordPress, чтобы заставить его делать то, что я хочу, и что WordPress активно борется со мной, связанным с URL-адресами. Так что с этим открывателем...
Обдумывая вашу проблему, я собираюсь сделать предложение, которое не совсем то, о чем вы просили. Если вы этого не сделаете найдите то, что вы ищете, это нормально, только, пожалуйста, не голосуйте против, потому что я просто пытаюсь помочь.
Таксономия Не является Единичным Приращением и Не имеет Мета
Одна из проблем с тем, что вы пытаетесь сделать, заключается в том, что система таксономии не упорядочивает ни одного приращения , и у нее нет мета. Например, в серии из 3 сообщений вы можете найти термины с ID
373
, 411
и 492
; вы можете понять, что 373 = #1
, 411 = #2
и 492 = #3
но это все случайно и относительно друг друга. Это все равно, что пытаться найти корень вашего сайта WordPress в коде плагина, но вы не знаете, на сколько уровней будет сохранен ваш код. Конечно, можно написать код, чтобы разобраться во всем этом и сопоставить их, но это становится сложным, и я не уверен, что вы получите большую пользу от попыток разобраться в этом вместо использования другого подхода.
Явно Назначьте Номера Своих Страниц
Итак, первое, что я бы предложил, это вам явно назначьте свои номера страниц для каждого поста в вашей серии , используя мета-/пользовательские поля поста (я выбрал термин installment
вместо page
, потому что для меня это имело больше смысла, но очевидно, что вы можете использовать любой термин, подходящий для вашего случая использования.)
Назначение номеров страниц/платежей дает вам преимущество в том, что вы полностью контролируете ситуацию, и таким образом вы будете знать, что исправить, когда что-то не в порядке, и если вы хотите изменить порядок, вы можете сделать это, просто изменив числа. Я предполагаю, что у вас будет метабокс редактирования для пользовательского имени поля _installment
для выбора номеров платежей (и он может даже управлять/манипулировать номерами платежей с помощью AJAX, если вы хотите проявить творческий подход, чтобы у вас никогда не было несинхронизированных страниц.)
Используйте $wp_rewrite->add_rule()
, чтобы явно назначить Свой URL-адрес
Я не буду вдаваться в подробности, так как знаю, что у вас, как правило, сумасшедшие навыки работы с WordPress, поэтому я просто отмечу
, что $wp_rewrite->add_rule()
- это способ заставить все это работать. Все остальное просто обеспечение поддержки вокруг результата этой функции. С помощью крючка init
назначьте свое правило URL:
<?php
add_action('init', 'add_series_installment_url');
function add_series_installment_url() {
global $wp,$wp_rewrite;
$wp->add_query_var('series');
$wp->add_query_var('installment');
$wp_rewrite->add_rule('series/([^/]+)/(installment-\d+)','index.php?series=$matches[1]&installment=$matches[2]','top');
$wp_rewrite->flush_rules(false); // This should really be done in a plugin activation
}
Используйте parse_query
крючок для перевода URL-адреса в запрос Vars
Во 2-й половине этого решения используется крючок parse_query
, с которым, я знаю, вы хорошо знакомы. В общем случае мы фиксируем query_vars
, определенные в init
и записанные с помощью правила URL, и преобразуем их в то, что нам нужно для запроса сообщений WordPress с помощью taxonomy
+term
обработка ваших series
и meta_key
+meta_value
обработка явно назначенных взнос/страница:
<?php
add_action('parse_query', 'apply_series_installment_to_query');
function apply_series_installment_to_query(&$query) {
if (isset($query->query['series']) && isset($query->query['installment']) &&
preg_match('#^installment-(\d+)$#',$query->query['installment'],$match)) {
$query->query_vars['post_type'] = 'post';
$query->query_vars['taxonomy'] = 'series';
$query->query_vars['term'] = $query->query['series'];
$query->query_vars['meta_key'] = '_installment';
$query->query_vars['meta_value'] = $match[1];
unset($query->query_vars['series']); // You don't need this
unset($query->query_vars['installment']); // or this
unset($query->query_vars['name']); // or this
}
}
Краткое описание
Обычно я бы углубился в объяснение ответа, но уже поздно, я слишком мало спал за последние 48 часов, и самое главное, я знаю, что вы можете это понять, вам, вероятно, просто нужна была одна вещь, о которой я здесь упомянул.
Поэтому я надеюсь, что вам понравится это решение. Даже если вы этого не сделаете, две части с init
и parse_query
и $wp_rewrite->add_rule()
и $query->query_vars[]
соответственно - это то, что вам нужно, даже если вы хотите придерживаться своего оригинальная архитектура. Удачи и с нетерпением ждем возможности увидеть это, когда вы это сделаете и в Интернете!
В любом случае, Надеюсь, это поможет.
Вот код, который я использую для изменения количества записей на страницах архива категорий и тегов:
query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );
Если вы не можете заставить это работать с пользовательской таксономией, попробуйте использовать собственные (категории, теги), чтобы проверить, связана ли проблема с самим кодом, с таксономией или с чем-то еще.
Также я не уверен, пропустили ли вы это или пропустили, но $paged не является глобальной переменной. Он должен быть извлечен как get_query_var("выгруженный")
Однажды я столкнулся с проблемой по этому поводу и часами переживал трудные времена, дергая себя за волосы. Я погуглил и не нашел никакого конкретного решения по этим темам. Я нашел статью о нескольких талантах, но они не удовлетворяли моим проблемам. На самом деле разбиение страницы архива пользовательской таксономии на страницы зависит от некоторых настроек аргументов связанных функций. Поэтому я на самом деле собираюсь поделиться здесь своими мыслями о решении проблемы разбиения архива таксономии на страницы.
Пять вещей, которые вам нужны для пользовательская разбивка страниц архива таксономии на страницы работает отлично:
(1) Не ставьте ключ параметра exclude_from_search
в качестве параметра аргумента register_post_type
или не устанавливайте его 'exclude_from_search' => false
. По умолчанию он установлен false
.
(2) Таксономия, которая будет использоваться с пользовательским набором типов записей 'taxonomies' => 'custom_taxonomy_name'
в качестве параметра аргумента register_post_type
или использовать register_taxonomy_for_object_type()
напрямую. Пользовательские таксономии все еще должны быть зарегистрированы в register_taxonomy()
.
(3) При выполнении запроса в new WP_Query ($args)
I) Если не установлено в admin static front page
, используйте перед new WP_Query($args)
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
И использовать $query = new WP_Query( array( 'paged' => $paged ) );
Ii) Если задано в статической главной странице администратора, используйте перед "новым WP_Query($args)":
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
И использовать $query = new WP_Query( array( 'page' => $paged ) );
Не забудьте использовать posts_per_page
и paged
параметр в массиве аргументов new WP_Query($arg)
.
Если не задана статическая главная страница, то вам следует использовать параметр page
в массиве аргументов new WP_Query ($arg)
.
(4) Используйте функцию Wordpress paginate_links( $args )
, подобную приведенному ниже примеру, для отображения разбивки на страницы в файле шаблона архива.
<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%', or '/paged=%#%', // if using pretty permalink
'current' => max( 1, get_query_var('paged') ),
'total' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page
?>
(5) В paginate_links()
функция выводит список ul li
с классом page-numbers
.
Если вы используете bootstrap, добавьте класс pagination
в класс ul
с помощью javascript или jquery, и будет выведена красивая причудливая разбивка на страницы.
Надеюсь, теперь вы можете наслаждаться разбиением на страницы в шаблоне архива таксономии без каких-либо проблем с 404:-)