Ефективний перетин таксономії


9

У мене є багато можливостей для цього, але я хочу знати найефективніший спосіб робити те, що буде дорогою операцією.

Як приклад я буду використовувати магазин.

Подано:

  • Таксономія торгової марки
  • Таксономія групи продуктів
  • Тип продукту
  • Архівні шаблони для вищезгаданих таксономій

Який найефективніший і найефективніший метод показу бренд-меню в архіві типів продукту, а тип продукту - в архіві торгової марки, але показуйте лише ті умови, які застосовуються до публікацій цієї групи.

Так, наприклад, якщо я перебуваю в групі товарів "Жінки", вона відображатиме бренди з лівої сторони, але лише ті марки, які вказані для товарів із групи товарів "жінки". Наприклад, бренд "Фантазія жіночого одягу Inc" показав би, але не "Manly mens Manly ltd".

Мені потрібна загальна відповідь, хоча я радий тому, що приклад виробів з одягом буде використаний, і я знаю, як це зробити з жадібним алгоритмом грубою силою, але це неймовірно марно, і мене не цікавить рішення, яке збільшило б завантаження кожної сторінки на кілька секунд і завантажило б усі записи в повному обсязі з БД

редагувати: Приклад 2:

Пікачу - це жовтий покемон і міститься в жовтій мітці, але Пікачу - це також електричний покемон, тому він знаходиться в електричній бирці типу таксономії. Як я можу показувати лише типи покемонів, які є жовтими, коли в архіві жовтих тегів? наприклад, зелений покемон на траві означає, що в жовтому архіві не буде пункту меню, але в зеленому (так, я знаю, трав'яний покемон не зелений)

Відповіді:


13

Для узагальнення це питання виведення всіх термінів систематики А, які мають посади із конкретним терміном таксономії B.

Хоча це не є неможливим у кілька кроків та велика кількість циклічного перегляду постів (що справді буде неефективним), я думаю, що розумно пройти SQL для підвищення ефективності.

Моє грубо сприйняте це:

/**
 * Get all terms of $tax_to taxonomy that posts in $term_from of $tax_from have.
 *
 * @param string $tax_from  taxonomy name
 * @param string $term_from term slug
 * @param string $tax_to    taxonomy name
 *
 * @return array|WP_Error
 */
function get_intersected_terms( $tax_from, $term_from, $tax_to ) {

    global $wpdb;

    $term_from = get_term_by( 'slug', $term_from, $tax_from );

    $query = "
    SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = '{$tax_to}' AND term_taxonomy_id IN (
        SELECT term_taxonomy_id FROM {$wpdb->term_relationships} WHERE object_id IN (
            SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = {$term_from->term_taxonomy_id}
        )
    )
    ";

    $term_ids = $wpdb->get_col( $query );

    if( empty( $term_ids) )
        return array();

    return get_terms( $tax_to, array( 'include' => $term_ids ) );
}

// example
var_dump( get_intersected_terms( 'category', 'cat-a', 'post_tag' ) );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.