Я пытался настроить способ писать сообщения в серии на моем сайте. Идея состоит в том, что каждый пост может принадлежать к разным сериям в пользовательской таксономии. У меня почти все настроено так, как я хочу… за одним исключением.
Регистрация таксономии
Эта часть работает. Я добавил следующий код в плагин:
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);
безрезультатно… идеи? Советы? Предложения?
Привет @EAMann :
Я съеживаюсь каждый раз, когда мне нужно сделать что-то творческое с URL-адресами в WordPress, поскольку система URL-адресов, на мой взгляд, является самым неэлегантным аспектом WordPress. Я всегда чувствую, что мне приходится бороться с WordPress, чтобы заставить его делать то, что я хочу, и что WordPress активно сопротивляется мне, связанному с URL-адресами. Так что с этим открывалкой…
Размышляя над вашей проблемой, я собираюсь сделать предложение, которое не совсем то, о чем вы просили. Если вы не находите, что это то, что вы ищете, это нормально, просто, пожалуйста, никто не голосует против, потому что я просто пытаюсь помочь.
Таксономия не является единым приращением и не имеет метаданных
Одна из проблем с тем, что вы пытаетесь сделать, заключается в том, что система таксономии не имеет единого порядка приращения и не имеет meta. Например, в серии из 3 постов вы можете найти термины с
ID
s373
и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:Используйте
parse_query
хук для перевода URL в Query VarsВо второй половине этого решения используется
parse_query
хук, с которым, как я знаю, вы хорошо знакомы. В общем, мы фиксируемquery_vars
определенные вinit
и захваченные с помощью правила URL и преобразуем их в то, что нам нужно для запроса сообщений WordPress сtaxonomy
+term
обработкой вашихseries
иmeta_key
+meta_value
обработкой явно назначенной части/страницы:Резюме
Обычно я бы углубился в объяснение ответа, но уже поздно, я слишком мало спал за последние 48 часов, и, самое главное, я знаю, что вы можете понять это, вам, вероятно, просто нужна была одна вещь, которую я упомянул здесь.
Итак, я надеюсь, вам понравится это решение. Даже если у вас нет двух частей с
init
иparse_query
и$wp_rewrite->add_rule()
и$query->query_vars[]
соответственно, это то, что вам нужно, даже если вы хотите придерживаться своей исходной архитектуры. Удачи и с нетерпением жду встречи, когда вы это сделаете и онлайн!В любом случае, надеюсь, это поможет.
Я закончил тем, что использовал большую часть этого для того, что я делаю. URL-адреса моей серии теперь соответствуют строкам
http://localhost/wp/series/my-test-series/
иhttp://localhost/wp/series/my-test-series/2/
. В конечном итоге я добавлю некоторые серверные элементы управления для динамической нумерации страниц, чтобы вы могли удалять/перетаскивать/отбрасывать/упорядочивать серии в пользовательском интерфейсе… прямо сейчас это жестко закодировано с явно увеличенными значениями в пользовательском мета-поле.@EAMann Круто! Рад, что это помогло. С нетерпением жду результатов.
Итак… вот результаты: mindsharestrategy.com/series/wp-xmlrpc Это серия, над которой я работаю (обновляется по пятницам), которая охватывает пошаговое руководство по системе WP XML-RPC. Плагин моей серии все еще находится в разработке, но вы можете видеть контекстную навигацию внизу, и нумерация страниц тоже работает нормально.
Я использую
$paged = get_query_var('paged')
, но пропустил это, так как мои фрагменты кода уже становились довольно длинными. Попробую ваш метод, может поможет!! Это тааак 2010!
Вот код, который я использую для изменения количества сообщений на архивных страницах категорий и тегов:
Если вы не можете заставить это работать с пользовательской таксономией, попробуйте использовать собственные (категории, теги), чтобы проверить, связана ли проблема с самим кодом, таксономией или чем-то еще.
Также я не уверен, что вы пропустили это или пропустили, но $paged не является глобальной переменной. Он должен быть получен как get_query_var(‘paged’)
Однажды я столкнулся с проблемой по этому поводу и провел тяжелые времена часами, выдергивая волосы. Я гуглил и не нашел конкретного решения по темам. Я нашел статьи нескольких талантов, но они не удовлетворяли мои проблемы. На самом деле пагинация страниц архива пользовательской таксономии зависит от некоторых настроек аргументов связанных функций. Итак, я собираюсь поделиться здесь своими мыслями о решении проблемы нумерации страниц архива таксономии.
Пять вещей, которые вам нужны для идеальной нумерации страниц архива пользовательской таксономии:
(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 ) Если
static front page
ранее не было установлено использование администраторомnew WP_Query($args)
и использовать
$query = new WP_Query( array( 'paged' => $paged ) );
ii) Если задано использование статической главной страницы администратора перед ‘new WP_Query($args)’:
и использовать
$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 )
, как в примере ниже, для отображения разбивки на страницы в файле шаблона архива.( 5 )
paginate_links()
Функция выводитul li
листинг сpage-numbers
классом. Если вы используетеpagination
класс начальной загрузкиul
с помощью javascript или jquery, будет выведена красивая причудливая нумерация страниц.Надеюсь, теперь вы можете наслаждаться нумерацией страниц в шаблоне архива таксономии без проблем с ошибкой 404 🙂