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

wordpress.stackexchange https://wordpress.stackexchange.com/questions/1635

  •  16-10-2019
  •  | 
  •  

Вопрос

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

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

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

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. Итак, с этим новичком ...

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

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

Одна из проблем с тем, что вы пытаетесь сделать, - это Система таксономии не заказа и это нет мета. Анкет Например, в серии 3 Post вы можете найти термины с IDс 373, 411 а также 492; Вы можете выяснить, что 373 = #1, 411 = #2 а также 492 = #3 Но это все случай и относительно друг друга. Это все равно, что пытаться расположить корень вашего сайта WordPress в коде плагина, но вы не знаете, сколько уровней глубоко будет сохранено. Конечно, может написать код, чтобы выяснить все это и составить их на карту, но это становится сложно, и я не уверен, что вы получите большую ценность из -за попытки выяснить это вместо того, чтобы использовать другой подход.

Явно назначите номера ваших страниц

Итак, первое, что я бы предложил, это то, что ты явно присваивается ваш Номера страниц Для каждого поста в вашей серии Использование поля Meta/пользовательские поля (я выбрал термин installment вместо page Потому что это имело больше смысла для меня, но явно вы могли бы использовать любой термин, который подходит для вашего варианта использования.)

Присвоение номеров страниц/рассрочки имеет преимущество в том, что вы находитесь под полным контролем, и таким образом вы узнаете, что исправить, когда что -то из удара, и если вы хотите переупорядочить, вы можете сделать это, просто изменив числа. Я предполагаю, что у вас будет редактировать метабокс для пользовательского имени поля _installment Для выбора номеров рассрочки (и это может даже управлять номерами рассрочки/жонглирования через AJAX, если вы хотите проявить творческий подход, чтобы у вас никогда не было страниц из синхронизации.)

Использовать $wp_rewrite->add_rule() явно назначить свой URL

Я не буду глубже, так как я знаю $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 ) );

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

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

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

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

(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) Если установлено на статической первой странице Admin.

  $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 Inject pagination класс в ul С помощью JavaScript или jQuery и хорошей модной страниц будет выводить.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top