Отправить на разные отдельные страницы по категориям, когда существует несколько категорий.

Вопрос или проблема

Мои посты могут иметь любую из 2 категорий:
1. красная
2. синяя

У меня есть 2 разные страницы категорий
category-red.php
category-blue.php

Пост может принадлежать как к красной, так и к синей категории

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

Это возможно?

Я думаю, что вы могли бы настроить оператор if/else в вашем index.php, который вызывает одиночные .php файлы как части шаблона. Важно, чтобы вы поставили совместное условие (синий и красный) первым в списке условий. Обратите внимание, что имена, которые вы используете в get_template_part, должны соответствовать slug, связанным с файлами, которые вы хотите получить. Если ваш php файл на одной странице single-red.php, то slug будет просто 'single-red', без .php.

Для контроля трех возможностей

if ( in_category('red') && in_category('blue') ) {
     get_template_part( 'single-red' ); //обе
} elseif ( in_category('red') ) {
    get_template_part( 'single-red' );  //только красная
} else {
    get_template_part( 'single-blue' ); // только синяя
    
}

или даже более элегантно, если вы не заботитесь о отслеживании только красных:

Для контроля только двух возможностей

if ( in_category('red') ) {
     get_template_part( 'single-red' ); // только красная ИЛИ синяя и красная
} elseif ( in_category('blue'){
    get_template_part( 'single-blue' ); //только синяя
    
}

Обратите внимание, что если у вас есть только категории ‘red’ и ‘blue’, то вам не нужен финальный ‘else’. Но если у вас есть посты, которые не являются ни ‘red’, ни ‘blue’, и вы хотите, чтобы они выглядели по-другому, вам может потребоваться сделать что-то подобное ниже. Обратите внимание, что вам понадобится третий php файл, вызываемый slug ‘single’ (например, single.php), для этого:

Для обработки третьей категории по умолчанию, отличной от двух других

if ( in_category('red') ) {
     get_template_part( 'single-red' ); // только красная ИЛИ синяя и красная
} elseif ( in_category('blue'){
    get_template_part( 'single-blue' ); //только синяя
} else {
    get_template_part( 'single' ); // одиночный по умолчанию
    
}

Также обратите внимание, что в приведенном выше коде я использовал только однопараметричные условные операторы ‘in_category’. Я имею в виду, что в функции “in_category” я вводил только категорию, либо ‘red’, либо ‘blue’. Это однопараметричное использование допустимо, если вы находитесь “в цикле”, но если вы не в цикле, вам может потребоваться передать посты в функцию ‘in_category’, используя подход, предложенный в Codex, с двумя параметрами. Так что, если вы не в цикле, вы будете у стакана обозначение переменной, хранящей ваш пост (например, $post), и затем использовать что-то вроде этого in_category('red', $post); или in_category('red', $post->ID); вместо простого in_category('red').

Надеюсь, это поможет вам! Пожалуйста, попробуйте и дайте мне знать, если столкнетесь с какими-либо проблемами!

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

Основные возможности, которые приходят мне на ум, это либо

  • добавить переменную в ссылку на архив категорий, одиночное чтение её и назначает правильный класс
  • одиночное получает реферала из запроса и на его основе назначает правильный класс

В первом случае вы можете использовать функции WordPress add_query_arg и get_query_var для создания и чтения пользовательской переменной запроса.

Во втором случае вы можете использовать wp_get_referer, wp_get_original_referer или даже PHP [$_SERVER\['HTTP_REFERER'\]]5

Имейте в виду, что изменение HTML-разметки таким образом, используя только PHP, затрудняет кэширование страницы. Вы могли бы экспериментировать, используя чисто javascript-подход, проверяя [document.referrer]6 (который покажет исходный URL, который вы можете проанализировать) и применяя класс с помощью скрипта.

Если вы используете WordPress, то можете использовать обе категории для одной страницы, просто нужно определить основную. Например, если вы определите ‘Red’ как основную категорию, а ‘Blue’ как второстепенную, подчиненная страница будет отображаться в обеих категориях. Единственное отличие будет в структуре URL и на пути следования хлебных крошек, который будет следовать по пути категории ‘Red’, даже если вы перейдете через категорию ‘Blue’, он покажет структуру URL и хлебные крошки согласно категории ‘Red’, что не вызывает дублирующих проблем. И наконец, поисковые роботы будут следовать по пути навигации хлебных крошек, что означает, что поисковый бот пройдет через категорию ‘Red’.

.

Ответ или решение

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

Теория

В WordPress категории часто используются как таксономии для организации контента. Каждому посту может быть назначено несколько категорий. В описанной ситуации имеется две категории: "красная" и "синяя", каждая из которых имеет свою специфическую страницу отображения (category-red.php и category-blue.php). Проблема возникает в тот момент, когда пост относится сразу к обеим категориям, и необходимо определить, какой шаблон одиночной страницы применять.

Пример

Для обеспечения правильной логики отображения нужно внедрить условные инструкции (if/else) в шаблоны, которые позволят определить, с какой страницы категории был вызван пост. Одним из способов может быть использование файлов шаблонов для конкретных категорий. Например, если пост был открыт с категорийной страницы "красного", то должен использоваться шаблон single-red.php.

if ( in_category('red') && in_category('blue') ) {
    get_template_part( 'single-red' ); // для присутствия в обеих категориях
} elseif ( in_category('red') ) {
    get_template_part( 'single-red' );  // только для "красных"
} else {
    get_template_part( 'single-blue' ); // только для "синих"
}

Можно написать более оптимизированный код, если не требуется различение между ситуацией, когда пост принадлежит двум категориям или только "красной".

if ( in_category('red') ) {
    get_template_part( 'single-red' ); // для "красной" или и "красной", и "синей"
} elseif ( in_category('blue') ) {
    get_template_part( 'single-blue' ); // только для "синих"
}

Применение

Существует несколько подходов для реализации маршрутизации и отображения постов:

  1. Использование переменных URL для обозначения источника: В случае, когда пост открывается с категории, можно добавить специальную переменную в URL. Функции add_query_arg и get_query_var помогут в добавлении и извлечении этой информации. Это позволит шаблону одиночной страницы знать, какая категория "вызвала" пост.

  2. Анализ HTTP реферера: Использование функции wp_get_referer или PHP переменной $_SERVER['HTTP_REFERER'] поможет определить, с какой страницы пользователь попал на текущую. Однако важно учесть, что не всегда реферер доступен. Этот метод может помочь определить, какому шаблону использовать, но может быть ненадежным при строгих настройках конфиденциальности пользователя или при использовании кеширования.

  3. JavaScript и динамическое изменение классов: Также возможно внедрить скрипт, который будет изменять класс HTML элемента в зависимости от предыдущей страницы. Это может усложнить кеширование, поскольку изменится серверная логика, однако способствует быстрому изменению интерфейса на клиентской стороне.

  4. Назначение первичной категории: В WordPress можно определить "первичную" категорию для поста. Тогда URL и структура хлебных крошек будут следовать этой категории, что также может решить проблему дублирования контента.

Заключение

Решение проблемы выбора страницы для отображения поста, принадлежащего к нескольким категориям в WordPress, подразумевает гибкость и понимание как внутренних механизмов WordPress, так и особенностей реализации таксономий. Проще всего подходить к этой задаче с пониманием конечной цели: например, если критично, чтобы пост использовал только один тип стиля оформления вне зависимости от второго контакта, выбор "первичной" категории может быть оптимальным решением. Важным аспектом является также учет возможностей кеширования и влияния различных способов реализации на производительность и безопасность сайта.

Оцените материал
Добавить комментарий

Капча загружается...