Исправление разбиения на страницы с помощью Пользовательского архива таксономии


Я пытался настроить способ написания постов в серии на своем сайте. Идея заключается в том, что каждая запись может принадлежать к другой серии в пользовательской таксономии. Я почти все устроил так, как мне хочется... за одним исключением.

Регистрация таксономии

Эта часть работает. Я вставил следующий код в плагин:

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);

Безрезультатно... идеи? Чаевые? Предложения?

Author: Community, 2010-09-11

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[] соответственно - это то, что вам нужно, даже если вы хотите придерживаться своего оригинальная архитектура. Удачи и с нетерпением ждем возможности увидеть это, когда вы это сделаете и в Интернете!

В любом случае, Надеюсь, это поможет.

 6
Author: MikeSchinkel, 2010-09-11 09:23:20

Вот код, который я использую для изменения количества записей на страницах архива категорий и тегов:

query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );

Если вы не можете заставить это работать с пользовательской таксономией, попробуйте использовать собственные (категории, теги), чтобы проверить, связана ли проблема с самим кодом, с таксономией или с чем-то еще.

Также я не уверен, пропустили ли вы это или пропустили, но $paged не является глобальной переменной. Он должен быть извлечен как get_query_var("выгруженный")

 2
Author: Rarst, 2010-09-11 08:05:01

Однажды я столкнулся с проблемой по этому поводу и часами переживал трудные времена, дергая себя за волосы. Я погуглил и не нашел никакого конкретного решения по этим темам. Я нашел статью о нескольких талантах, но они не удовлетворяли моим проблемам. На самом деле разбиение страницы архива пользовательской таксономии на страницы зависит от некоторых настроек аргументов связанных функций. Поэтому я на самом деле собираюсь поделиться здесь своими мыслями о решении проблемы разбиения архива таксономии на страницы.

Пять вещей, которые вам нужны для пользовательская разбивка страниц архива таксономии на страницы работает отлично:

(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:-)

 0
Author: saifulmasud, 2016-02-01 13:21:25