WooCommerce: скрыть категорию из виджета категории продуктов - PullRequest
0 голосов
/ 12 апреля 2020

Как правило, я в состоянии выполнить каждое из моих требований WP самостоятельно, но этот оказался немного сложным.

Дело в том, что мне нужно скрыть определенные категории из виджетов категории продуктов на основе в категории, в которой я нахожусь.

Пример: когда я нахожусь в категории A, я хочу показать категории A, B, C, D, но не E. Однако, когда я нахожусь в категории B, я хочу показать категории A, B, C, D и E. Тогда, скажем, я нахожусь в категории C и хочу показывать только категории C и D.

Я нашел следующий код

add_filter( 'woocommerce_product_categories_widget_args', 'woo_product_cat_widget_args' );

function woo_product_cat_widget_args( $cat_args ) {

                $cat_args['exclude'] = array('15');

                return $cat_args;

}

Что я хочу сделать с помощью этого кода добавить несколько строк, где я бы определил, что, например, когда я открываю ID категории 1, не отображаются идентификаторы 2,3,4. Затем в следующей строке будет указано, какие идентификаторы не следует отображать для идентификатора 2, затем для, скажем, идентификатора 4 и т. Д.

/ * EDIT Удивительный пользователь stackoverflow помог мне, создав Код вы можете увидеть в его посте ниже. Однако, как мы выяснили, приведенный выше пример работает только для встроенного виджета категорий продуктов WP.

Это привело меня к выводу, что используемый виджет категорий продуктов создан специально для темы Я использую и, очевидно, он использует этот код для работы:

if ( !function_exists( 'getbowtied_megamenu_output_shop_icons' )):
    /**
     * Build the layout for the "Shop Icons" type megamenu
     *
     * @param  int $theID  id of the menu item
     *
     * @return html
     */

    function getbowtied_megamenu_output_shop_icons( $theID, $cat= false) {
        if ( !GETBOWTIED_WOOCOMMERCE_IS_ACTIVE ) return;
            $cat_list = GBT_Opt::getOption('product_categories_icons_megamenu_' . $theID );
            ob_start();
            if ($cat !== true):
                $args= array( 'taxonomy' => 'product_cat','hide_empty' => 0, 'menu_order' => 'asc',  'parent' =>0, 'include' => $cat_list );
            else:
                $args= array( 'taxonomy' => 'product_cat','hide_empty' => 0, 'menu_order' => 'asc',  'parent' =>$theID, 'include' => $cat_list );
            endif;
            $cats = get_terms( $args );

            if ( is_array($cat_list)):
            $unsorted = array();
            $sorted   = array();

            foreach ($cats as $v) {
                $unsorted[$v->term_id] = $v;
            }

            foreach ($cat_list as $v) {
                if (isset($unsorted[apply_filters( 'wpml_object_id', $v, 'category', TRUE)]))
                $sorted[] = $unsorted[apply_filters( 'wpml_object_id', $v, 'category', TRUE)];
            }
            else:
                $sorted = $cats;
                $sorted = array_slice($cats, 0, 8);
            endif;

            echo '<div class="megamenu_icon_list">';
            foreach( $sorted as $cat ) {
                $icon_type = get_term_meta( $cat->term_id, 'getbowtied_icon_type', true );
                if ( $icon_type == 'custom_icon' ) {
                    $thumbnail_id   = get_term_meta( $cat->term_id, 'icon_img_id', true );
                    if ($thumbnail_id)
                        $icon = wp_get_attachment_thumb_url( $thumbnail_id );
                    else
                        $icon = wc_placeholder_img_src();
                    // Prevent esc_url from breaking spaces in urls for image embeds
                    // Ref: https://core.trac.wordpress.org/ticket/23605
                    $icon = str_replace( ' ', '%20', $icon );
                    echo '<a href="'.esc_url( get_term_link( $cat->term_id ) ).'"><img src="'. $icon .'" alt="'. $cat->name .'" /><span>'. $cat->name .'</span></a>';
                } else {
                    $icon = get_term_meta( $cat->term_id, 'icon_id', true );
                    if (!$icon) {
                        $icon = 'thehanger-icons-alignment_align-all-1';
                    }
                    echo '<a href="'.esc_url( get_term_link( $cat->term_id ) ).'"><i class="'. $icon .'"></i><span>'. $cat->name .'</span></a>';    
                } 
            }
            echo '</div>';
            $output = ob_get_contents();
            ob_end_clean();
            return $output;
    }
endif;

* /

Пожалуйста, кто-нибудь может указать мне правильное направление относительно того, как подходить к этому задание?

Заранее спасибо.

1 Ответ

2 голосов
/ 12 апреля 2020

Есть несколько способов, например, следующим образом

function woo_product_cat_widget_args( $cat_args ) { 
    if ( is_product_category() ) {
        // Get current category id
        $current_cat_id = get_queried_object_id();

        // Category id = ?, exclude ids ??
        $cat_id_1_exclude_ids = array( 1, 2, 3, 4 );
        $cat_id_2_exclude_ids = array( 1, 2, 3, 4, 5 );
        $cat_id_15_exclude_ids = array( 16, 18 );

        if ( !empty( $current_cat_id ) ) {
            // Excludes ID's based on current category id
            // Extra check that the variable name (array) exists
            $exclude_ids = isset( ${'cat_id_' . $current_cat_id . '_exclude_ids'} ) ? ${'cat_id_' . $current_cat_id . '_exclude_ids'} : '';

            if ( $exclude_ids ) {
                $cat_args['exclude'] = $exclude_ids;
            }
        }
    }

    return $cat_args;
}
add_filter( 'woocommerce_product_categories_widget_args', 'woo_product_cat_widget_args', 10, 1 );
add_filter( 'woocommerce_product_categories_widget_dropdown_args', 'woo_product_cat_widget_args', 10, 1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...