Задать вопрос

Как решить конфликт между одинаковыми алиасами пользовательского типа контента и обычной страницы?

Добрый день.
Ситуация такова: есть кастомный тип контента с алиасом products. Архивной страницы у него нет (has_archive = false), это сделано потому, что по адресу /products находится обычная страница со своим контентом и своей логикой вывода собственно продуктов. Каждый продукт размещен по адресу /products/product-title. Это все работает прекрасно.

Однако сейчас требуется добавить по адресу /products/page-title страницу. Но если так сделать, она будет недоступна из-за того, что алиас products занят пользовательским типом, и вордпресс считает, что раз продукта по этому адресу нет, то ничего там быть в принципе не может.

Из придуманных вариантов - переписывать rewrite_rules (геморно и непросто), либо в шаблоне проверять, является ли текущий пост страницей, и если да - выводить страницу (смахивает на костыль и в принципе некрасиво). Вариант создать эту страницу как отдельный пост типа products еще более некрасив, чем предыдущие.

Что можно сделать в данной ситуации, как выйти из нее наиболее красивым способом?
Спасибо.
  • Вопрос задан
  • 286 просмотров
Подписаться 2 Оценить Комментировать
Решение пользователя Алексей Николаев К ответам на вопрос (3)
Heian
@Heian Автор вопроса
Ашот
Работающее решение проблемы. Если тип поста отличается от дефолтных, но он не найден, проверяем, существует ли страница с таким адресом.

function loop_cpt_filter($wp_query) {
  // Variables
  $post_slug = null;
  $query_vars = $wp_query->query_vars;

  // If CPT is set but post not found
  if(!$wp_query->post_count && isset($query_vars['post_type'])) {
    $post_type = $query_vars['post_type'];
    $cpt_object = get_post_type_object($post_type);

    if(isset($query_vars[$post_type])) {
      $post_slug = trim($cpt_object->rewrite['slug'] . '/' . $query_vars[$post_type], '/');
    }

    // If page by that slug exists, set post to the current query
    if($post_slug && ($page = get_page_by_path($post_slug))) {     
      $wp_query->set('post_type', 'page');
      $wp_query->set('p', null);
      $wp_query->set('page_id', $page->ID);
    }
  }
}
add_action('pre_get_posts', 'loop_cpt_filter', 100, 1);
Ответ написан
Комментировать