EAMann
  • 0
Гуру

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

  • 0

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

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

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

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

безрезультатно… идеи? Советы? Предложения?

Share
  1. Привет @EAMann :

    Я съеживаюсь каждый раз, когда мне нужно сделать что-то творческое с URL-адресами в WordPress, поскольку система URL-адресов, на мой взгляд, является самым неэлегантным аспектом WordPress. Я всегда чувствую, что мне приходится бороться с WordPress, чтобы заставить его делать то, что я хочу, и что WordPress активно сопротивляется мне, связанному с URL-адресами. Так что с этим открывалкой…

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

    Таксономия не является единым приращением и не имеет метаданных

    Одна из проблем с тем, что вы пытаетесь сделать, заключается в том, что система таксономии не имеет единого порядка приращения и не имеет meta. Например, в серии из 3 постов вы можете найти термины с ID s 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 в Query Vars

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

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

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

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

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

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

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

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

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

    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    

    и использовать$query = new WP_Query( array( 'paged' => $paged ) );

    ii) Если задано использование статической главной страницы администратора перед ‘new 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 классом. Если вы используете pagination класс начальной загрузки ul с помощью javascript или jquery, будет выведена красивая причудливая нумерация страниц.

    Надеюсь, теперь вы можете наслаждаться нумерацией страниц в шаблоне архива таксономии без проблем с ошибкой 404 🙂

    • 0

Оставить ответ

You must login to add an answer.