Intereting Posts
Должны ли все плагины быть инкапсулированы в класс? Как я могу автоматически вставлять содержимое страницы в качестве заголовка? CSS? Ver = 4.7.3 не найден Можно ли удалить <ul> <li> из виджета категории по умолчанию? Disallow: / wp- * в файле robots.txt? Как удалить даты из существующих постоянных ссылок? Включить персонализированные сообщения Post Type в шаблоне страницы в контекстном режиме (или я должен виджет?) Заказать DESC по значению meta_key wp_localize_script, переменная не определена в jquery Как заблокировать определенные сообщения (cpt) от редактирования кем угодно, кроме ADMINS Многостраничное обновление базы данных требует успеха, но db_version не обновляется get woocommerce Ссылка на мою учетную запись Как отделить вывод подменю и поддерживать связь с родительским WordPress, показывающий изображение в виде эскиза без использования эскиза Добавление ссылки на заголовок в описании, но не в заголовке, см. Скриншоты прилагаются

WordPress implode & wp_insert_post вопрос

Всего несколько дней назад я начал работать над своим новым сайтом, основанным на WordPress.

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

Итак, я создал пользовательскую функцию в functions.php. Я поместил идентификатор из плагина базы данных автомобиля, и моя функция автоматически заполняет мои поля, когда я публикую или обновляю сообщение (wp_insert_post). Кажется, все работает нормально, но …

В моей функции у меня есть этот код:

if ( isset( $cardet['marks'] ) ) wp_set_object_terms( $post_id, implode(', ', $cardet["marks"]), 'mark' ); 

Что делает эта функция? Он просто получает 3-4 разных марки автомобилей от $ cardet ['marks'] и разлагает его. Это требуется только для таксономий.

Итак, после того, как я нажму публикацию или обновление сообщения:

Все в порядке, так выглядит на странице «Редактировать пост». Создано 3 разных термина.

работает отлично

И это моя проблема. Когда я перехожу на страницу своей таксономии, я получил это: он создал только один термин:

только 1 термин, почему?

Мне действительно нужна твоя помощь. Мне нужно иметь разные термины. Невозможно найти решение для этого.

Второй параметр wp_set_object_terms() принимает массив, целое число или строку.

( array / int / string ) ( обязательно ). Slug или id термина (например, идентификаторы категорий или тегов) заменят все существующие связанные термины в этой таксономии. Чтобы очистить или удалить все условия от объекта, пропустите пустую строку или NULL. Целые числа интерпретируются как идентификаторы тегов. Предупреждение: некоторые функции могут возвращать term_ids как строки, которые будут интерпретироваться как пули, состоящие из числовых символов!

Вы создаете массив ( $cardet["marks"] ), но затем implode() . Когда вы implode() вы превращаете этот массив в строку, разделенную запятой, которую wp_set_object_terms() интерпретирует как одно значение. wp_set_object_terms() не будет разбивать строку на запятую и создавать для вас несколько терминов, но решение прост, так как вы добавили шаг, который нарушает работу. Удалите этот шаг и передайте массив в wp_set_object_terms() .

 if ( isset( $cardet['marks'] ) ) wp_set_object_terms( $post_id, $cardet["marks"], 'mark' ); 

В Codex есть пример кода, выполняющий именно это, но с идентификаторами:

 // An array of IDs of categories we want this post to have. $cat_ids = array( 6, 8 ); /* * If this was coming from the database or another source, we would need to make sure * these where integers: $cat_ids = array_map( 'intval', $cat_ids ); $cat_ids = array_unique( $cat_ids ); */ $term_taxonomy_ids = wp_set_object_terms( 42, $cat_ids, 'category' ); 

Если $cardet["marks"] – это данные, предоставленные пользователем, $cardet["marks"] ним перед его использованием.

Implode превращает ваш массив как этот array( 'Audi', 'BMW', 'Mercedes-Benz' ) в строку, разделенную разделителем, установленным в первом параметре функции, в данном случае – запятой и пробелом. В некотором смысле вы можете превратить массив в CSV из этого. Результат: Audi, BMW, Mercedes-Benz .

Как работает WordPress, он ищет существующий термин (внутри этой таксономии), и если он не существует, он создает новый …

В WordPress Codex говорится, что термины могут быть предоставлены как массив, целое число или строка, однако я думаю, что параметры integer и string могут быть для добавления одного термина за раз, я не думаю, что он будет повторно взорвать строка и, что более важно, это бессмысленный процесс взлома и взрыва массива, когда он принимает массив в любом случае, и это то, что у вас есть в $cardet['marks'] .