wp_set_object_terms()
Прикрепляет пост (запись) к термину (элементу таксономии). Например, можно поместить пост в указанную категорию. Создает термины, если их нет.
Нужно, чтобы термин был в указанной таксономии. Нет смысла указывать термин(ы), если строго не определить к какой таксономии он(и) относится.
Важно: если в параметр $terms указываются ID, или массив из ID, то убедитесь, что переменные передаются как числа (тип int), а не как строки! Потому что строки в виде числа, например, '98'
будут интерпретироваться как название термина, а не его ID!
Используйте wp_remove_object_terms(), чтобы наоборот, удалить запись из терминов.
Хуки из функции
Возвращает
Массив|WP_Error
. Массив ID терминов, к которым были прикреплены записи. В случае ошибки вернет 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:
wp_set_object_terms( 54, array('метка1','метка2'), 'post_tag' );
#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 | Введена. |