Intereting Posts
WordPress не показывает ссылки на страницы Как создать пользовательскую панель мониторинга для веб-сайта членства? Примечание. Неопределенный индекс: host в /var/www/html/wp-includes/canonical.php в строке 445 Как реализовать это отображение подкаталогов в multisite? неожиданная проблема в перезаписи URL Почему WordPress конвертирует абсолютные URL-адреса в относительные URL-адреса для пунктов меню? Отображать содержимое на одной странице Необходимо хранить пользовательскую информацию (много-много связей), предпочтительно не как пользовательский мета Пользовательское уведомление для участников, планирующих расписание Замена скриптов в Admin Load_Scripts Контролировать содержимое до и после настраиваемого цикла post post Применение класса к ссылкам вокруг собственных изображений, встроенных в сообщения / страницы Поле подтверждения при отправке сообщения для проверки Есть ли строка запроса для edit.php для отображения всех сообщений, у которых нет пользовательских терминов таксономии? Общие рекомендации по обращению к страницам, ориентированным на контент

Элегантный способ добавления родительских категорий?

Есть ли более элегантный способ автоматического добавления родительских категорий через PHP (а не JavaScript) при регистрации категорий для публикации с какой-либо пользовательской страницы?

I Добавьте категории, отмеченные следующим кодом:

wp_set_post_terms($post_id, $catarray, 'category'); 

И затем, чтобы автоматически добавить родительские категории, я написал весь этот случай с коммутатором, который мне часто нужно обновлять вручную … = S Есть ли более элегантный способ, чем здесь ниже?

 foreach ($catarray as $cat) { switch ($cat) { case "228": // アクセサリーcase "226": // バッグcase "224": // 衣服case "231": // 帽子・スカーフcase "229": // ジュエリーcase "262": // 雨具case "227": // 靴case "230": // 生地case "232": // 腕時計$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '225')"); // Apparel & Accessories(アパレル&アクセサリー) break; case "252": // カー部品$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '251')"); // カー用品break; case "284": // 携帯電話・アクセサリーcase "266": // 家電case "222": // オーディオ・映像装置case "221": // その他のデジタル製品$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '17')"); // デジタル製品&家電break; case "204": // 乾燥食品case "197": // 飲料品case "203": // 青果品case "206": // 肉類case "199": // 面類・米&小麦case "202": // ソース類case "201": // スパイス・調味料類case "200": // お菓子・スナック類case "205": // 野菜類$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '198')"); // 飲食料品break; case "218": // 浴槽製品case "220": // 家具case "216": // キッチン用具・食器case "219": // 伝統工芸品case "272": // 雑貨$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '217')"); // 家具・キッチン用具・食器break; case "254": // すべての農作製品$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '253')"); // 農作製品break; case "236": // アニメ製品case "237": // ギフト製品case "234": // 玩具$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '235')"); // ギフト・玩具・アニメ製品break; case "214": // 美容器具・製品case "208": // 化粧品case "211": // 香水case "212": // スキンケア製品case "213": // 石鹸・洗髪料case "210": // サプリメント・ビタミン$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '209')"); // 健康・美容製品break; case "250": // 工業製品case "248": // 建設資材case "247": // 床材case "264": // 水周り製品$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '249')"); // 工業・建設資材&製品break; case "269": // エネルギー・ソーラーcase "245": // 照明$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '244')"); // 照明・エネルギーbreak; case "242": // 芸術品case "243": // 高級ステレオ$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '241')"); // 高級製品break; case "261": // 医療品・医薬品case "267": // 化学製品case "268": // 研究器具$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '260')"); // 医療品・化学製品・研究器具break; case "240": // オフィス用品case "263": // スクラッチカードcase "169": // 文房具$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '238')"); // オフィス什器・文房具break; case "259": // スポーツ器具case "256": // スポーツウェアcase "258": // 運動補助器具$wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '257')"); // スポーツ関連break; default: break; } } 

Solutions Collecting From Web of "Элегантный способ добавления родительских категорий?"

wp_set_post_terms() использует wp_set_object_terms() . Существует крючок действия, называемый set_object_terms который срабатывает при успешной установке условий объекта. Крючок действия выглядит так:

 do_action ( 'set_object_terms', int $object_id, array $terms, array $tt_ids, string $taxonomy, bool $append, array $old_tt_ids ) 

Что мы можем сделать здесь, внутри нашей функции обратного вызова мы можем проверить, являются ли введенные нами термины верхним уровнем, а если нет, мы можем получить родительские идентификаторы от объектов term, а затем добавить родительские термины к объекту post

Вы можете попробовать следующее:

 add_action( 'set_object_terms', function ( $object_id, $terms, $tt_ids, $taxonomy ) { // Lets make sure we run this only once remove_action( current_action(), __FUNCTION__ ); // Lets only target the category taxonomy, if not, lets bail if ( 'category' !== $taxonomy ) return; // Make sure we have terms to avoid bugs if ( !$tt_ids ) return; // Get all the terms already assinged to the post- $post_terms = get_the_terms( $object_id, $taxonomy ); if ( $post_terms ) { $post_term_ids = wp_list_pluck( $post_terms, 'term_id' ); // Bail if $post_term_ids === $tt_ids if ( $post_term_ids === $tt_ids ) return; } // We are busy with the category taxonomy, continue to execute $parent_ids = []; // Lets loop through the terms and get their parents foreach ( $tt_ids as $term ) { // Get the term object $term_object = get_term_by( 'id', $term, $taxonomy ); // If top level term, just continue to the next one if ( 0 === $term_object->parent ) continue; // Our term is not top level, save the parent term in an array $parent_ids[] = $term_object->parent; } // Make sure we have parent terms, if not, bail if ( !$parent_ids ) return; // Make sure we do not have duplicate parent term ID's, if so, remove duplicates $parent_ids = array_unique( $parent_ids ); // Make sure that our parent id's not in the $terms array, if so, remove them $parent_ids = array_diff( $parent_ids, $tt_ids ); // Make sure we still have parent ID's left if ( !$parent_ids ) return; // Lets add our parent terms to the object's other terms wp_set_object_terms( $object_id, $parent_ids, $taxonomy, true ); }, 10, 4 ); 

EDIT – Use-case

Вышеприведенный код входит в ваш functions.php и автоматически добавляет родительские термины к сообщению, если мы передадим любые дочерние термины в wp_set_object_terms() .

Теперь в вашем шаблоне вы можете сделать следующее

 $child_cat_ids = [120]; // Array of child categories wp_set_object_terms( 147, // Post ID $child_cat_ids, // Array of child category ID's 'category', // Taxonomy the terms belongs to true // Only append terms to existing ones ); 

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

 function wpse_set_parent_terms($post_id, $post){ $post_type = 'post'; //set the post type you wish to operate on $taxonomy = 'category'; //set the taxonomy you wish to operate on if(get_post_type() !== $post_type) { return $post_id; } foreach(wp_get_post_terms($post_id, $taxonomy) as $term){ while($term->parent !== 0 && !has_term($term->parent, $taxonomy, $post)) { wp_set_post_terms($post_id, array($term->parent), $taxonomy, true); $term = get_term($term->parent, $taxonomy); } } } add_action('save_post', 'wpse_set_parent_terms', 10, 2); 

Это должно быть довольно … ↓

введите описание изображения здесь

Надеюсь, это поможет…