Intereting Posts
Post__not_in удаляет только первые 2 страницы Могу ли я получить разные ссылки для разных установленных тем? Безопасный WordPress: Изменить admin Локальная установка wordpress. Задача базы данных Отфильтровать сообщения WordPress между параметрами Является ли определение ('WP_CACHE', true) необходимым для кэширования объектов? Как исправить мою RSS-ленту, которая была испорчена после того, как я изменил тему WordPress? Использование локальных шаблонов и коротких кодов не работает Как добавить локальных пользователей в WordPress без пароля по электронной почте? Как ускорить загрузку плагина wordpress disqus? add_meta_box создает типы полей формы по умолчанию Программно вставить сообщение, как если бы это было сделано через панель администратора Как добавить исходный код в WordPress сообщение действительно? Sitewide на всех блогах в сети Пользовательский метафайл удаляется по сериализованному значению ключа

Проблема с pre_get_posts на страницах архива типа пользовательского типа

обзор

  1. Я создаю тему, которая имеет 2 пользовательских типа сообщений (как пользовательские плагины):

    1. статьи
    2. Отзывы
  2. Я также создал шаблоны single-articles.php и archive-articles.php внутри плагина. То же самое для Обзоров CPT.

  3. Оба типа сообщений используют стандартные таксоны WordPress (категории и теги)

  4. Настройки моего чтения установлены на «Статическая страница»,

    1. Главная страница: Главная (пользовательский файл front-page.php который я создал)

    2. Страница сообщений: страница «Новости сайта» (которую я хочу показать BOTH сообщениям и CPT)

Проблема

После создания регулярного сообщения и сообщения, основанного на CPT, я перешел на страницу «Основные сообщения» («Новости сайта»), в которой я не видел тип персонализированного сообщения (только сообщение, использующее стандартный тип сообщения).

После некоторого поиска (я нооб) я понял, что если бы я хотел отображать CPT на главной странице сообщений, мне пришлось бы писать фильтр, используя pre_get_posts .

Итак, напомню: я хочу показать

  1. ОБА регулярных сообщений и пользовательских типов сообщений (CPT) на главной странице сообщений
  2. ОБА регулярные сообщения и пользовательские типы сообщений (CPT) для страниц архивов категорий

Вот что я сделал

 // Add custom post types to the default loop (ref: http://bit.ly/1bqeBJC) function odigbs_add_custom_types( $query ) { if ( !is_admin() && !is_preview() ) { if ( (is_home() || is_category() || is_tag() || is_archive() || is_feed() ) && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'articles', 'reviews') ); return $query; } } } add_filter( 'pre_get_posts', 'odigbs_add_custom_types' ); 

Я уверен, что это не правильный способ создать этот фильтр, но я не могу найти статью, которая полностью объясняет эту концепцию … так что я ее закрываю .

Результаты

  1. Если я перейду к: http://site.dev/the-site-news/ (главная страница сообщений из настроек чтения), теперь я вижу все мои пользовательские типы сообщений, и он использует single-{post_type}.php внутри плагина.
  2. Если я нажимаю на любой из терминов таксономии, страница идет по archive-{post_type}.php : http://site.dev/category/{some term}/ и использует archive-{post_type}.php внутри плагина.

Но…

  1. Если я укажу свой браузер на http://site.dev/{custom_post_type} (т. Е. Не используя категорию), чтобы увидеть архивы для этого CPT, сайт выдает всевозможные ошибки.
  2. Но если я отключу фильтр, то теперь я могу перейти на http://starter.dev/{custom_post_type}/ , но я вернусь туда, где я начал с сообщений по умолчанию, отображаемых на главной странице сообщений. Нет настраиваемых типов сообщений.

Вопросов

  1. Есть (как я подозреваю) проблема в фильтре?
  2. Если да, то как это должно быть написано?

Надеюсь, я четко сформулировал драму …

заранее спасибо

Если мы посмотрим в исходном коде , мы увидим, при каких условиях is_archive верно:

 if ( $this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax ) $this->is_archive = true; 

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

Если я правильно понимаю, вы хотите, чтобы ваши CPT отображались на обычных страницах архива (cateogires, основной запрос и т. Д.), Но при поиске только ваших CPT вы снова получаете свои CPT со всеми регулярными сообщениями и т. Д.

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

измените YOURCPT для своего cpt 🙂

 add_action( 'pre_get_posts', 'wpstck_get_YOURCPT_into_posts' ); function wpstck_get_YOURCPT_into_posts($query){ if ( !is_post_type_archive() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'YOURCPT' ) ); return $query; } }