Вопрос или проблема
У меня есть пользовательский тип записи “овощи”
У меня есть серия пользовательских полей для каждого месяца года в виде флажков
У меня есть пользовательская таксономия “Сезоны”, которую я хочу назначить на основе отмеченных полей
Лето, если отмечены июнь, июль, август
Осень, если отмечены сентябрь, октябрь, ноябрь
Зима, если отмечены декабрь, январь, февраль
Весна, если отмечены март, апрель, май
Таким образом, овощ может быть назначен на все сезоны или один сезон в зависимости от отмеченных пользовательских полей
add_action( 'save_post', 'assign_cat_to', 10, 1 );
function assign_cat_to( $post_id ) {
if ( 'seasonal-product' !== get_post_type( $post_id ) ) {
return;
}
$term_slugs = array();
foreach ( $_POST as $field => $value ) {
if ( 0 === strpos( $field, 'wpcf-available-in-' ) && '1' === $value ) {
$term_slugs[] = str_replace( 'wpcf-available-in-', '', $field );
}
}
if ( empty( $term_slugs ) ) {
return;
}
$term_ids = array();
foreach ( $term_slugs as $term_slug ) {
$term = get_term_by( 'slug', $term_slug, 'season' );
$term_ids[] = $term->term_id;
}
wp_set_object_terms( $post_id, $term_ids, 'season' );
}
Я внес некоторые обновления на основе фактических полей и терминов, но я все еще не понимаю, как назначить “весну, лето, осень, зиму” термину.
В качестве альтернативы, я мог бы хранить название сезона “весна, лето, осень, зима” в базе данных вместо “1”; будет ли это проще для записи в slug термина?
/**
* Программное назначение термина таксономии по пользовательским полям
*
* @param int $post_id
*/
function rd_assign_taxonomies($post_id) {
if (get_post_type($post_id) == 'vegetables') {
$terms = array();
// Здесь мы проверяем, есть ли у поста конкретные поля, и если да, то добавляем ID или slugs таксономических терминов в массив $terms
// Точные детали будут зависеть от того, как были реализованы флажки, например, как нативные postmeta или поля ACF
wp_set_object_terms( $post_id, $terms, 'seasons', false );
}
}
add_action('save_post', 'rd_assign_taxonomies');
Что насчет программного назначения термина и таксономии вашей пользовательской записи с помощью wp_set_object_terms
?
add_action( 'save_post', 'assign_cat_to', 10, 1 );
function assign_cat_to( $post_id ) {
if ( 'vegetables' !== get_post_type( $post_id ) ) {
return;
}
$term_slugs = array();
foreach ( $_POST as $field => $value ) {
if ( 0 === strpos( $field, 'available_in_' ) && '1' === $value ) {
$term_slugs[] = str_replace( 'available_in_', '', $field );
}
}
if ( empty( $term_slugs ) ) {
return;
}
$term_ids = array();
foreach ( $term_slugs as $term_slug ) {
$term = get_term_by( 'slug', $term_slug, 'seasons' );
$term_ids[] = $term->term_id;
}
wp_set_object_terms( $post_id, $term_ids, 'seasons' );
}
Ответ или решение
Для программного назначения таксономии на основе значений пользовательских полей в WordPress, необходимо создать функционал, который будет считывать состояниe флажков (checkbox) для каждого месяца и в зависимости от этого добавлять соответствующие термины в таксономию «Сезоны». Ниже приведён подробный ответ на заданную задачу, который учитывает все аспекты и детали.
Шаги по назначению таксономии на основе значений пользовательских полей
-
Создание пользовательских полей: Убедитесь, что у вас есть пользовательские поля, представляющие каждый месяц (например,
available_in_january
,available_in_february
и т.д.), где значение 1 означает, что овощ доступен в этот месяц. -
Регистрация таксономии: Убедитесь, что таксономия «Сезоны» зарегистрирована в вашем WordPress-сайте.
-
Создание функции для назначения таксономии:
В данной функции мы будем проверять, установлены ли флажки для месяцев, и на основе этого будем определять, к какому сезону относится данный овощ. Код будет выглядеть следующим образом:
add_action('save_post', 'assign_season_taxonomy_based_on_custom_fields', 10, 1);
function assign_season_taxonomy_based_on_custom_fields($post_id) {
// Проверка типа поста
if ('vegetables' !== get_post_type($post_id)) {
return;
}
// Массив для хранения сезонов
$seasons = [];
// Проверяем каждый месяц и добавляем соответствующий сезон
if (isset($_POST['available_in_june']) && $_POST['available_in_june'] === '1') {
$seasons[] = 'summer';
}
if (isset($_POST['available_in_july']) && $_POST['available_in_july'] === '1') {
$seasons[] = 'summer';
}
if (isset($_POST['available_in_august']) && $_POST['available_in_august'] === '1') {
$seasons[] = 'summer';
}
if (isset($_POST['available_in_september']) && $_POST['available_in_september'] === '1') {
$seasons[] = 'fall';
}
if (isset($_POST['available_in_october']) && $_POST['available_in_october'] === '1') {
$seasons[] = 'fall';
}
if (isset($_POST['available_in_november']) && $_POST['available_in_november'] === '1') {
$seasons[] = 'fall';
}
if (isset($_POST['available_in_december']) && $_POST['available_in_december'] === '1') {
$seasons[] = 'winter';
}
if (isset($_POST['available_in_january']) && $_POST['available_in_january'] === '1') {
$seasons[] = 'winter';
}
if (isset($_POST['available_in_february']) && $_POST['available_in_february'] === '1') {
$seasons[] = 'winter';
}
if (isset($_POST['available_in_march']) && $_POST['available_in_march'] === '1') {
$seasons[] = 'spring';
}
if (isset($_POST['available_in_april']) && $_POST['available_in_april'] === '1') {
$seasons[] = 'spring';
}
if (isset($_POST['available_in_may']) && $_POST['available_in_may'] === '1') {
$seasons[] = 'spring';
}
// Удаление дубликатов, если они есть
$seasons = array_unique($seasons);
// Назначаем таксономию
wp_set_object_terms($post_id, $seasons, 'seasons', false);
}
Объяснение кода
- Проверка типа поста: В начале функции проверяется, является ли текущий пост типом
vegetables
. - Определение доступных сезонов: Далее, запрашиваем значения из массива
$_POST
для каждого месяца и, если значение равно «1», добавляем соответствующий сезон в массив$seasons
. - Уникальность сезонных терминов: При помощи
array_unique()
убираем повторы из массива. - Назначение термина: В конце массива
$seasons
передаётся в функциюwp_set_object_terms()
, которая обновляет таксономию.
Заключение
Данный код позволит автоматически присваивать сезоны на основе выбранных месяцев для вашего настраиваемого типа поста овощей. Этот подход обеспечивает гибкость и простоту использования, а также при необходимости легко расширяется. При правильном использовании, он станет надежным решением для вашей задачи управления контентом в WordPress.
Не стесняйтесь задавать уточняющие вопросы или запрашивать дополнительную помощь, если потребуется.