wp_set_object_terms()
Прикрепляет пост (запись) к термину (элементу таксономии). Например, помещает пост в указанную категорию.
Создает указанный термин (элемент таксономии), если его еще нет.
Нужно, чтобы термин был в указанной таксономии. Нет смысла указывать термин(ы), если строго не определить к какой таксономии он(и) относится.
Важно: если в параметр $terms указываются ID, или массив из ID, то убедитесь, что переменные передаются как числа (тип int), а не как строки! Потому что строки в виде числа, например, '98' будут интерпретироваться как название термина, а не его ID!
Используйте wp_remove_object_terms(), чтобы наоборот, удалить запись из терминов.
Хуки из функции
Возвращает
Массив|WP_Error.
-
array— Массив ID терминов, к которым были прикреплены записи. ID будут в виде строк:[ '123', '124' ]
- WP_Error — В случае ошибки.
Использование
wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
- $object_id(число) (обязательный)
- ID записи, которую нужно связать с термином.
- $terms(строка/массив/число) (обязательный)
Название, ярлык или ID элемента таксономии, который нужно установить или создать и установить для записи. Можно указать массив из Названий, ярлыков или ID.
Функция создаст новый термин, если не найдет подходящий.
- Если указать название (в кириллице), то функция создаст термин. При этом: название будет названием в кирилице, а ярлык (слаг) создастся из названия (обработается функцией sanitize_title()).
Важно: если указываются ID, или массив из ID, то убедитесь, что переменные передаются как числа (тип int), а не как строки! Потому что строки в виде числа, например,
'98'будут интерпретироваться как название термина, а не его ID!- $taxonomy(строка) (обязательный)
- Таксономия к которой принадлежат указанные термины, которые нужно связать с записью.
Например:category,post_tagили название произвольной таксономии. - $append(логический)
Добавить связь или установить новую (добавить или заменить термины):
false(по умолчанию) - старая связь записи с терминами будет разорвана и установлена связь с новыми (указанными) терминами.true- старые связи останутся (будут заменены при совпадении) и добавятся новые указанные связи.
По умолчанию: false
Примеры
#1 Поместим запись в указанные рубрики
Пример, показывающий как добавить запись 42 в категории 6 и 8:
$cat_ids = array( 6, 8 );
// чтобы убедится, что термины переданы как числа:
// $cat_ids = array_map('intval', $cat_ids );
wp_set_object_terms( 42, $cat_ids, 'category' );
Если ID терминов указаны как строки, то wp_set_object_terms() создаст рубрики с такими названиями, а не прикрепит запись к термину...
#2 Удалим запись из всех рубрик
Если нужно удалить запись 42 из всех рубрик (даже которая установлена по умолчанию):
wp_set_object_terms( 42, NULL, 'category' );
#3 Создадим метки и поместим в них запись
Этот пример создает метки метка1 и метка2, если таких меток нет и помещает в эти метки запись 54:
$result = wp_set_object_terms( 54, [ 'метка1', 'метка2' ], 'post_tag' ); /** $result = array( '123', '124' ); */
#4 Более строгая функция установки термина для поста
Чтобы не переживать о том, что текущая функция может создать термин если его нет и которой при этом обязательно нужно указывать таксономию, даже если мы передаем ID терминов.
Вся эта магия только усложняет код. Поэтому в одном из своих проектов я написал следующую функцию, с которой проще и понятнее работать.
Этой функции нужно передать ID поста и ID термина/терминов к которым мы хотим прикрепить пост. Таксономию указывать не нужно. Если указанного термина нет, то функци просто пропустит его, ничего не создавая. Если указаны ID терминов из разных таксономий - вы получите ошибку.
/**
* Sets specified terms for the specified posts.
* Wrapper for wp_set_object_terms() with strict behavior, requiring term IDs only.
*
* @param int $post_id
* @param int[]|int $term_ids
* @param bool $append
*
* @return int[]|WP_Error
*/
function strict_set_post_terms( $post_id, $term_ids, $append = true ){
$post_id = (int) $post_id;
$term_ids = array_filter( array_map( 'intval', (array) $term_ids ) );
if( ! $post_id ){
return new WP_Error( 'error', 'Invalid or missing post ID.' );
}
if( ! $term_ids ){
return new WP_Error( 'error', 'No valid term IDs provided.' );
}
$taxonomy = '';
// check terms
foreach( $term_ids as $index => $term_id ){
$term = get_term( $term_id );
if( ! $term ){
unset( $term_ids[ $index ] );
continue; // skip invalid terms
}
if( $taxonomy && $taxonomy !== $term->taxonomy ){
return new WP_Error( 'error', 'Terms from different taxonomies specified.' );
}
$taxonomy = $term->taxonomy;
}
if( ! $term_ids ){
return new WP_Error( 'error', 'No valid term IDs provided.' );
}
$result = wp_set_object_terms( $post_id, $term_ids, $taxonomy, $append );
if( ! is_wp_error( $result ) ){
$result = array_map( 'intval', $result );
}
return $result;
}
Заметки
- Global. wpdb. $wpdb WordPress database abstraction object.
Список изменений
| С версии 2.3.0 | Введена. |