Безбрачный terms php. Архивы таксономии: Вывод списка постов по терминам таксономии

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


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

Таким образом, вместо одного длинного списка посетители будут видеть список по каждому термину таксономии.

Что вам потребуется

Для работы с этой статьей вам понадобится установленная и настроенная система WordPress и редактор кода. Вы будете создавать тему, которая является дочерней для темы twentyfourteen , так что вам нужно ее установить (она является темой WordPress по умолчанию).

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

1. Приступаем к работе: регистрация типа записи и таксономии

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

Примечание: Я использую тот же тип записей ‘animal’, который я зарегистрировала в предыдущей статье по . Если вы захотите создать более продвинутый набор инструментов, вы можете объединить технику, описанную в той статье, с техникой, которую я покажу вам здесь, и выводить списки терминов таксономии на своем сайте с характерными изображениями.

В файл функций вашей темы добавьте следующий код, чтобы зарегистрировать тип записей:

// регистрируем пользовательский тип записей "animals" function wptp_create_post_type() { $labels = array("name" => __("Animals"), "singular_name" => __("animal"), "add_new" => __("New animal"), "add_new_item" => __("Add New animal"), "edit_item" => __("Edit animal"), "new_item" => __("New animal"), "view_item" => __("View animal"), "search_items" => __("Search animals"), "not_found" => __("No animals Found"), "not_found_in_trash" => __("No animals found in Trash"),); $args = array("labels" => $labels, "has_archive" => true, "public" => true, "hierarchical" => false, "supports" => array("title", "editor", "excerpt", "custom-fields", "thumbnail", "page-attributes"), "taxonomies" => array("post_tag", "category"),); register_post_type("animal", $args); } add_action("init", "wptp_create_post_type");

Затем добавьте код для регистрации таксономии:

// регистрируем таксономию "Animal Family" function wptp_register_taxonomy() { register_taxonomy("animal_cat", "animal", array("labels" => array("name" => "Animal Families", "singular_name" => "Animal Family", "search_items" => "Search Animal Families", "all_items" => "All Animal Families", "edit_item" => "Edit Animal Families", "update_item" => "Update Animal Family", "add_new_item" => "Add New Animal Family", "new_item_name" => "New Animal Family Name", "menu_name" => "Animal Family",), "hierarchical" => true, "sort" => true, "args" => array("orderby" => "term_order"), "rewrite" => array("slug" => "animal-family"), "show_admin_column" => true)); } add_action("init", "wptp_register_taxonomy");

После того, как вы это сделали, добавьте в эти разделы некоторые данные. Ниже вы можете видеть данные, которые я добавила для применяемых терминов таксономии.

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

2. Настройка шаблона архива

Следующий шаг заключается в создании шаблона архива для нового типа записей. В вашей теме создайте новый файл под названием archive-animal.php .

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

Так что добавьте в шаблон архива следующие строки:

Примечание: Если вы работаете с собственной темой, скопируйте код оболочки из индексного файла или файла архива темы.

3. Заполнение шаблона архива: выборка терминов таксономии

Так как в архиве могут выводиться животные по терминам таксономии, следующим шагом, будет выборка этих терминов.

В вашем новом файле шаблона, ниже закрывающегося тега (или ниже открывающей части кода оболочки, если вы используете собственную тему), введите термины, используя get_terms() :

"count", "hide_empty" => 0)); ?>

Обратите внимание, что я использовала здесь два параметра:

  • orderby — позволяет указать порядок отображения терминов. Я использовала значение count , так что термин с наибольшим количеством переданных ему записей будет отображаться первым, но вы можете задать порядок сортировки по имени или ID — если оставить это поле пустым, WordPress будет выдавать значения по имени. Для более подробной информации ознакомьтесь с разделом кодекса по get_terms() ;
  • hide_empty — указывает WordPress не выбирать термины, без назначенных им записей. При этом если вы позже зададите тот же запрос, будет осуществляться проверка, не появились ли новые записи.

4. Заполнение шаблона архива: определение запроса

Сделав это, вы используете foreach() , чтобы указать WordPress перебрать каждый из этих терминов и выполнить запрос, который необходимо определить.

"animal", "animal_cat" => $term->slug); $query = new WP_Query($args); }

Это указывает WordPress перебрать каждый термин, а затем определить запрос — он должен запускаться каждый раз. Аргументы для запроса включают тип записей и термин в таксономии ‘animal_cat’ , который является значением переменной $term .

5. Заполнение шаблона архива: добавление цикла

Определив запрос, вам нужно добавить цикл. Сначала добавляется вывод в качестве заголовка названия запрашиваемого термина. Ниже строки, которая начинается с $query , но внутри фигурных скобок оператора foreach добавьте эту строку:

echo"

" . $term->name . "

";

Затем добавьте код, чтобы выводить записи списком:

// вывод списком заголовков записей echo ""; Теперь внутри списка добавьте цикл: // Начало цикла while ($query->have_posts()) : $query->the_post(); ?>

  • ">
  • Как вы можете видеть, это просто цикл, который выводит название каждого поста внутри ссылки на запись, и не выводит выдержки. Если хотите, вы можете добавить здесь выдержку или характерное изображение.

    И в конце ниже строки, считывающей echo ‘’;, сбрасывается запрос с помощью wp_reset_postdata() .

    Весь цикл

    Вот, как теперь будет выглядеть запрос и цикл:

    "animal", "animal_cat" => $term->slug); $query = new WP_Query($args); // вывод названий записей в тегах заголовков echo"

    " . $term->name . "

    "; // вывод списком заголовков записей echo "
      "; // Начало цикла while ($query->have_posts()) : $query->the_post(); ?>
    • ">
    • "; // используем сброс данных записи, чтобы восстановить оригинальный запрос wp_reset_postdata(); } ?>

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

      Получает элементы (термины) указанной таксономии по указанным параметрам.

      До версии WP 4.5 первый параметр get_terms() был названием таксономии или списком таких названий:

      $terms = get_terms("post_tag", [ "hide_empty" => false, ]);

      С версии WP 4.5 название таксономии нужно указывать в элементе массива taxonomy в параметре $args , а не во втором параметре, как это было раньше:

      $terms = get_terms([ "taxonomy" => "post_tag", "hide_empty" => false, ]);

      Обратная совместимость работает (функция понимает устарелый вызов).

      C версии 4.6. появился класс мета запросов WP_Term_Query{} . И теперь функция get_terms() является оберткой для этого класса.

      ✈ 1 раз = 0.015166с = тормоз | 50000 раз = 33.29с = очень медленно | PHP 7.1.11, WP 4.9.5

      Возвращает

      Массив/WP_Error/строка.

      • Массив объектов WP_Term - при успешном получении.
      • array() (пустой массив) - если термины не найдены.
      • WP_Error - если любой из указанных таксономий не существует.
      • Количество найденных терминов (в виде строки) - если fields = count .

      Шаблон использования

      $terms = get_terms(array("taxonomy" => array("post_tag", "my_tax"), // название таксономии с WP 4.5 "orderby" => "id", "order" => "ASC", "hide_empty" => true, "object_ids" => null, "include" => array(), "exclude" => array(), "exclude_tree" => array(), "number" => "", "fields" => "all", "count" => false, "slug" => "", "parent" => "", "hierarchical" => true, "child_of" => 0, "get" => "", // ставим all чтобы получить все термины "name__like" => "", "pad_counts" => false, "offset" => "", "search" => "", "cache_domain" => "core", "name" => "", // str/arr поле name для получения термина по нему. C 4.2. "childless" => false, // true не получит (пропустит) термины у которых есть дочерние термины. C 4.2. "update_term_meta_cache" => true, // подгружать метаданные в кэш "meta_query" => "",)); foreach($terms as $term){ print_r($term); }

      Использование

      get_terms($args, $deprecated); $args(строка/массив)

      Аргументы, в соответствии с которыми будет получен результат.

      Среди них обязательным является аргумент $args["taxonomy"] в котором указывается название таксономии или несколько названий таксономий в массиве.

      $deprecated(строка/массив) До версии 4.5 в этом аргументе указывались параметры $args, а первом параметре $args указывались называния таксономий. С версии 4.5 названия таксономий указываются в аргументе $args["taxonomy"] .
      По умолчанию: массив аргументов по умолчанию

      Аргументы параметра $args

      taxonomy(строка/массив) (обязательный) Название таксономии с которой работать. Можно указать несколько названий в виде массива. С версии WP 4.5, до этого названия таксономий указывались в первом параметре самой функции. number(число) Максимальное количество элементов, которые будут получены. Лимит.
      По умолчанию: все . object_ids(число/массив)

      Укажите тут число или массив чисел, чтобы получить термины, у которых поле object_id таблицы wp_term_relationships совпадет с указанными значениями.

      Обычно в поле object_id находятся ID записей к которым прикреплен термин.

      Include(строка/массив) Массив из ID терминов, которые нужно включить в выборку. Если указать этот параметр, то многие другие станут бесполезными. Парсится через wp_parse_id_list() .
      По умолчанию: "" exclude(строка/массив) Массив ID терминов, которые нужно исключить. Также можно указать строку в виде разделенных запятыми ID. Парсится через wp_parse_id_list() .
      По умолчанию: "" exclude_tree(строка/массив) Массив ID родительских терминов, которые нужно исключить. Исключена будет вся ветка. Парсится через wp_parse_id_list() .
      По умолчанию: "" offset(число) Верхний отступ в запросе. Сколько первых элементов пропустить. Указывать нужно число. По умолчанию без отступов. orderby(строка)

      Поле по которому сортировать результат. Может быть:

      • id или term_id - по ID.
      • name - по названию. По умолчанию.
      • count - по полю count в term_taxonomy - по количеству записей.
      • slug - по альтернативному названию.
      • description - по описанию.
      • term_group - по группе.
      • parent - по полю parent.

      • include - по порядку указанному в параметре $include
      • slug__in - с версии 4.9. В порядке указанном в параметре $slug.
      • meta_value - по значению произвольного поля
      • meta_value_num - по значению произвольного поля, значение будет интерпретироваться как число, а не строка.
      • ключ "meta_query" - в параметре $meta_query мы можем указать параметры запроса по метаполям, и там же указать ключ для конкретного запроса. Этот ключ можно использовать как ключ для сортировки по соответствующему метаполю.
      • none - не сортировать

      По умолчанию: "id"

      order(строка)

      Направление сортировки, указанной в параметре "orderby":

      • ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c);
      • DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a).

      По умолчанию: "ASC"

      Hide_empty(логический) Скрывать ли термины в которых нет записей. 1(true) - скрывать пустые, 0(false) - показывать пустые.
      По умолчанию: true fields(строка)

      Какие поля возвращать в результирующем массиве. Может быть:

      • all - Вернуть массив объектов (все данные) - по умолчанию;
      • ids - вернуть массив чисел;
      • names - вернуть массив строк.
      • count - (3.2+) возвращает количество найденных терминов.
      • id=>parent - вернуть массив, где ключ = ID термина, а значение = ID родительского термина.
      • id=>slug - вернуть массив, где ключ = ID термина, а значение = слаг (название для УРЛ) термина.
      • id=>name - вернуть массив, где ключ = ID термина, а значение = название (имя) термина.

      По умолчанию: "all"

      count(логический) true - вернет количество терминов. В этом случае, перебивает параметр fields .
      false - вернет массив объектов терминов. name(строка/массив) Укажите тут строку или массив строк, чтобы получить термины с указанными названиями.
      По умолчанию: "" slug(строка/массив) Укажите тут строку или массив строк, чтобы получить термины с указанными ярлыками (слагами).
      По умолчанию: "" hierarchical(логический)

      Включать ли в результат термины, которые имеют не пустые дочерние термины (в которых есть записи). Т.е. в массив будут включены пустые термины, если у их дочерних терминах есть записи, даже если аргумент " hide_empty " равен true .

      • true - да, включить;
      • false - нет, не включать.

      По умолчанию: true

      Search(строка) Поиск по названиям термина и его ярлыку. Получит термины в названиях которых есть вхождение указанной тут строки. Т.е. запрос выглядит так: LIKE "%search_string%" .
      По умолчанию: "" name__like(строка) Показать термины, в названии которых есть указанная строка. Поиск по строке.
      По умолчанию: "" description__like (строка) Показать термины, в описании которых есть указанная строка. Поиск по строке.
      По умолчанию: "" pad_counts(логический)

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

      pad_counts зависит от параметра parent потому что подсчет записей идет на уровне PHP и если например указать parent=0 , то будут получены только верхние термины и pad_counts не сможет правильно посчитать кол-во записей в дочерних терминах. Чтобы обойти это ограничение, нужно получить все термины, не указывая parent , а потом в PHP удалить ненужные... Вот пример такого кода:

      $terms = get_terms(array("hide_empty" => 0, "orderby" => "name", "order" => "ASC", "taxonomy" => "category", "pad_counts" => 1)); // оставим только термины с parent=0 $terms = wp_list_filter($terms, array("parent"=>0));

      По умолчанию: false

      get(строка)

      Если указать "all" то будут жёстко отключены параметры: childless , child_of , hide_empty , hierarchical и pad_counts . "Жёстко" - значит перебьет текущие установки для этих параметров. "Отключены" - значит им будет установлен параметр false или 0.

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

      // фрагмент кода if ("all" == $args["get"]) { $args["childless"] = false; $args["child_of"] = 0; $args["hide_empty"] = 0; $args["hierarchical"] = false; $args["pad_counts"] = false; }

      По умолчанию: ""

      child_of(число)

      ID родительского термина. Вывести элементы таксономии, которые являются дочерними разделами указанного элемента. Будут получены все уровни вложенности, все дерево.

      Если указаны несколько таксономий, параметр будет проигнорирован.
      По умолчанию: 0

      Parent(число)

      ID родительского термина, чтобы получить только прямых потомков.

      Будет получен только первый уровень вложенности, а не все дерево как в параметре child_of . Если указать 0, то будут выведены термины верхнего уровня.
      По умолчанию: ""

      Term_taxonomy_id(число/массив) Укажите тут число или массив чисел, чтобы получить термины, у которых поле term_taxonomy_id совпадет с указанными значениями.
      По умолчанию: "" cache_domain(строка) (3.2+) Позволяет установить уникальные ключ кэша, который будет использоваться в get_terms() при объектном кэшировании (object cache). Например, если вы используется один из фильтров get_terms(), чтобы изменить запрос (например "terms_clausses"), установив "cache_domain" в уникальное значение, позволить не перезаписывать сохраненный кэш для одинаковых запросов.
      По умолчанию: "core" update_term_meta_cache(логический) true - загрузить кэш метаданных, чтобы потом их можно было быстро получить. Кэш подгружается для полученных элементов.
      По умолчанию: true meta_query(массив) Запрос для получения элементов на основе метаданных. Смотрите WP_Meta_Query . meta_key(строка) Получит термины у которых есть указанное метаполе. Можно использовать в связке с meta_value .
      По умолчанию: "" meta_value(строка) Получит термины у которых значение метаполя равно указанному значению. Всегда используется в связке с meta_key .
      По умолчанию: "" suppress_filter(логический) Подавлять работу фильтров или нет? Если выставить в true, то фильтр get_terms просто не будет работать для текущего запроса терминов.
      По умолчанию: false (фильтры работают)

      Примеры

      #1 Получим массив данных о всех категориях на сайте

      Данные в массиве будут отсортированы по количеству записей (orderby=count) в каждой категории. Категории у которых нет записей все равно будут включены в массив (hide_empty=0).

      $myterms = get_terms("category", "orderby=count&hide_empty=0");

      #2 Выведем на экран список названий всех разделов таксономии "my_taxonomy":

      $terms = get_terms("my_taxonomy"); if($terms && ! is_wp_error($terms)){ echo "
        "; foreach($terms as $term){ echo "
      • ". $term->name ."
      • "; } echo "
      "; }

      В данном примере каждый $term из цикла foreach($terms as $term) , будет содержать такую информацию:

      => 162 => Здоровье => zdorove => 0 => 170 => my_taxonomy => => 0 => 2

      #3 Вывод рубрик через разделитель

      // получаем все термины из таксономии my_term $args = array("hide_empty=0"); $terms = get_terms("my_term", $args); // собираем их и выводим if (!empty($terms) && !is_wp_error($terms)) { $count = count($terms); $i=0; $term_list = "

      "; foreach ($terms as $term) { $i++; $term_list .= "name) . "">" . $term->name . ""; if ($count != $i) { $term_list .= " · "; } else { $term_list .= "

      "; } } echo $term_list; } /* в итоге получим подобный код: */

      Код get terms : wp-includes/taxonomy.php WP 5.2.2

      false,); /* * Legacy argument format ($taxonomy, $args) takes precedence. * * We detect legacy argument format by checking if * (a) a second non-empty parameter is passed, or * (b) the first parameter shares no keys with the default array (ie, it"s a list of taxonomies) */ $_args = wp_parse_args($args); $key_intersect = array_intersect_key($term_query->query_var_defaults, (array) $_args); $do_legacy_args = $deprecated || empty($key_intersect); if ($do_legacy_args) { $taxonomies = (array) $args; $args = wp_parse_args($deprecated, $defaults); $args["taxonomy"] = $taxonomies; } else { $args = wp_parse_args($args, $defaults); if (isset($args["taxonomy"]) && null !== $args["taxonomy"]) { $args["taxonomy"] = (array) $args["taxonomy"]; } } if (! empty($args["taxonomy"])) { foreach ($args["taxonomy"] as $taxonomy) { if (! taxonomy_exists($taxonomy)) { return new WP_Error("invalid_taxonomy", __("Invalid taxonomy.")); } } } // Don"t pass suppress_filter to WP_Term_Query. $suppress_filter = $args["suppress_filter"]; unset($args["suppress_filter"]); $terms = $term_query->query($args); // Count queries are not filtered, for legacy reasons. if (! is_array($terms)) { return $terms; } if ($suppress_filter) { return $terms; } /** * Filters the found terms. * * @since 2.3.0 * @since 4.6.0 Added the `$term_query` parameter. * * @param array $terms Array of found terms. * @param array $taxonomies An array of taxonomies. * @param array $args An array of get_terms() arguments. * @param WP_Term_Query $term_query The WP_Term_Query object. */ return apply_filters("get_terms", $terms, $term_query->query_vars["taxonomy"], $term_query->query_vars, $term_query); }

      Description

      Relates an object (post, link etc) to a term and taxonomy type (tag, category, etc). Creates the term and taxonomy relationship if it doesn"t already exist.

      A relationship means that the term is grouped in or belongs to the taxonomy. A term has no meaning until it is given context by defining which taxonomy it exists under.

      Usage

      Parameters

      $object_id () (required ) The object to relate to, such as post ID. Default: None $terms () (required ) The slug or id of the term (such as category or tag IDs), will replace all existing related terms in this taxonomy. To clear or remove all terms from an object, pass an empty string or NULL. Integers are interpreted as tag IDs. Warning: some functions may return term_ids as strings which will be interpreted as slugs consisting of numeric characters! Default: None $taxonomy () (required ) The context in which to relate the term to the object. This can be category, post_tag, or the name of another taxonomy. Default: None $append () (optional ) If true, terms will be appended to the object. If false, terms will replace existing terms Default: False

      Returns

      (mixed)
      • (array) An array of the terms (as term_taxonomy_ids ! ) affected if successful
      • (array) An empty array if the $terms argument was NULL or empty - successmessage for the removing of the term
      • () The WordPress Error object on invalid taxonomy ("invalid_taxonomy").
      • (string) The first offending term if a term given in the $terms parameter is named incorrectly. (Invalid term ids are accepted and inserted).

      Hooks

      • Action set_object_terms in

      Examples

      Setting a Post"s Categories

      If you want to set the categories of a post with the ID of 42:

      Note that this will set a post"s categories to be exactly the array you pass, any categories the post previously had will be removed from the post. See the next example.

      Adding Categories to a Post

      If you want to add categories to a post while keeping the categories it has already, you need to pass true for the $append parameter:

      Removing All Categories From a Post

      If you want to clear/remove all categories from a post, you can pass an empty value for $terms:

      Change Log

      • : Return object upon database insertion failure.
      • Since:

      Notes

      • does not check if there is a a relationship between the object (=post type) and the taxonomy (like post_tag, category or a custom taxonomy). Because of that, any existing term will be paired with the object, whether or not there is a connection between the object and the taxonomy (of this particular term)!! (Further information in german )
      • Perhaps the is a more useful function, since it checks the values​​, converting taxonomies separated by commas and validating hierarchical terms in integers.
      • It may be confusing but the returned array consists of term_taxonomy_ids instead of term_ids.