У меня есть 3 заголовка (header.php, header2.php и header3.php). Я хочу всегда отображать header.php вверху. Ниже header.php, я хочу, чтобы второй заголовок отображался в зависимости от категории. Если сообщение – Гризли-медведи, я хочу header2. Если сообщение «Трубы мира», мне нужен заголовок3.
Я понимаю, что отображается 2 заголовка:
<?php get_header(); get_header(header2); ?>
Но как я могу сделать второй заголовок зависимым от того, помечена ли категория (или добавлен тег, чтобы завершить этот вопрос)?
EDIT: Из-за помощи jgraup и karpstrucking я вижу, что этот вопрос не является полным:
С помощью …
if ( has_category( 'Grizzly Bears' ) ) { get_header( 'header2' ); } else if ( has_category( 'Peace Pipes' ) ) { get_header( 'header3' ); }
… работает только в том случае, если has_category является самой детской категорией. Я хотел бы применить условие к самой родительской категории. Этот код не подходит для этого. Например, я проверяю родительскую категорию «Grizzly Bears» и дочернюю категорию «Grizzly Bears Fishing», и я не могу использовать код для «Grizzly Bears».
Спасибо, JM
Вы можете использовать функцию has_category () для этого:
if ( has_category( 'Grizzly Bears' ) ) { get_header( 'header2' ); } else if ( has_category( 'Peace Pipes' ) ) { get_header( 'header3' ); }
Вы также можете добавить функцию has_tag . Оба принимают массив идентификаторов терминов, имен или слизней, если вы хотите сразу проверить кратность.
Изменить: изменено in_category
на has_category
для согласованности и потенциального будущего устаревания
Все, что я хочу сделать, в этом случае отображает заголовок (заголовок) 2 -IF – сообщение имеет определенную категорию. Я мог бы иметь только «медведей гризли» или мог иметь как «медведей гризли», так и своего ребенка «Гризли несет рыбу», или у меня может быть еще один ребенок «Гризли медведи», но до тех пор, пока эта категория «Grizzly bears» проверяется, Я хочу, чтобы оператор -THEN- произошел.
Мы все еще можем использовать ту же функцию, которую мы создали в ORIGINAL ANSWER , но мы немного изменим ее. Нам нужно будет получить категории, к которым принадлежит сообщение, а затем проверить, есть ли среди них медведи гризли
$parent_cat = 1, //Pass the ID, this will ID for 'Grizzly bears' $descendants = get_term_descendants( $parent_cat ); $post_terms = get_the_category( get_the_ID() ); $ids = wp_list_pluck( $post_terms, 'term_id' ); if ( $decendants && !in_array( $parent_cat, $ids ) ) { if ( has_category( $decendants ) ) { // Post belongs to parent cat descendants but not parent cat } } elseif ( in_array( $parent_cat, $ids ) ) { // Post belongs to the parent category } else { // Post does not belong to parent cat or any of its decendants }
Ваш вопрос немного трудно понять, но я отвечу на то, как я его прочитал.
Если вам нужно применить определенный заголовок для каждого к термину верхнего уровня и всех его потомков, вы можете написать свою функцию, используя get_terms()
чтобы вернуть всех потомков из данного родителя верхнего уровня
НЕПРАВИЛЬНЫЕ ПРИМЕЧАНИЯ ПЕРЕД КОДОМ:
Код не проверен и может быть ошибкой. Обязательно сначала проверьте это локально с включенной отладкой
Код должен содержать не менее PHP 5.4
Это может быть довольно многословным, поскольку нам нужно много работать, чтобы получить всех потомков с термина верхнего уровня. Заметьте, я объяснил это, но для повышения производительности удостоверьтесь, что вы передаете идентификатор, а не slug для функции, и не используете имена
function get_term_descendants( $term = '', $taxonomy = 'category' ) { // First make sure we have a term set, if not, return false if ( !$term ) return false; // Validate and sanitize taxonomy if ( 'category' !== $taxonomy ) { $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING ); // Make sure the taxonomy is valid if ( !taxonomy_exists( $taxonomy ) ) return false; // Make sure our taxonomy is hierarchical if ( !is_taxonomy_hierarchical( $taxonomy ) ) return false; } // OK, we have a term and the taxonomy is valid, now we need to validate and sanitize the term if ( is_numeric( $term ) ) { $term = filter_var( $term, FILTER_VAILDATE_INT ); } else { $term_filtered = filter_var( $term, FILTER_SANITIZE_STRING ); $term_object = get_term_by( 'slug', $term_filtered, $taxonomy ); $term = filter_var( $term_object->term_id, FILTER_VAILDATE_INT ); } // Everything is sanitized and validated, lets get the term descendants ids $term_descendants = get_terms( $taxonomy, ['child_of' => $term, 'fields' => 'ids'] ); // Check if we have terms if ( !$term_descendants ) return false; // We have made it, return the descendants return $descendants; }
Наша функция get_term_descendants()
теперь либо проведет массив идентификаторов термина потомка, переданного функции, либо вернет false, если переданный термин не имеет потомков
Теперь мы можем использовать нашу функцию и передать возвращенный массив идентификаторов непосредственно в has_category()
ПРИМЕЧАНИЕ. Вы можете передать идентификатор родительского термина или слизку функции. Не используйте имена, поскольку иерархические термины могут иметь повторяющиеся имена по разным иерархиям. Также обратите внимание: передача slug функции немного дороже, потому что мы будем использовать get_term_by()
чтобы получить идентификатор термина из пули. Для повышения производительности старайтесь всегда передавать идентификатор
$parent_cat = 1, //Pass the ID, can pass the slug, but reread the note above $descendants = get_term_descendants( $parent_cat ); if ( $decendants ) { $term_array = array_merge( $parent_cat, $descendants ); } else { $term_array = $parent_cat; } // Now we can check if the post belongs to the parent cat or one of his descendants if ( has_category( $term_array, $post ) ) { // Post belongs to parent cat or one of his descendants } else { // Post does not belong to the parent or any of his descendants }
Для всех категорий ( wp_get_post_categories )
Функция wp_get_post_categories () возвращает список категорий для сообщения.
get_header('header');
Условный на основе has_category
Проверьте, имеет ли текущий пост какую-либо из данных категорий. Данные категории проверяются на категории term_ids, имена и пули. Категории, заданные как целые числа, будут проверяться только на категории term_ids.
if(has_category('bears', $post)) { get_header('header2'); } else if(has_category('pipes', $post)) { get_header('header3'); }