Как переопределить виджеты woocommerce в дочерней теме? - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу внести некоторые изменения в виджет с именем WC-widget-price-filter. Я создал новый файл с таким же именем и точно таким же корнем в каталоге моей дочерней темы:

моя-тема / WooCommerce / включает / виджеты / класс-туалет-виджет-цена-filter.php

Изменения не появляются, я должен вызвать файл из functions.php моей дочерней темы? и если да, то как я могу?

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


Поэтому я попытался вставить этот код в мои functions.php и сделал только 1 незначительное изменение, которое не появилось. Что-то не так сделал?

class My_Widget_Price_Filter extends WC_Widget_Price_Filter {
   /**
 * Output widget.
 *
 * @see WP_Widget
 *
 * @param array $args     Arguments.
 * @param array $instance Widget instance.
 */
public function widget( $args, $instance ) {
    global $wp;

    if ( ! is_shop() && ! is_product_taxonomy() ) {
        return;
    }

    $min_price = isset( $_GET['min_price'] ) ? wc_clean( wp_unslash( $_GET['min_price'] ) ) : null; // WPCS: input var ok, CSRF ok.
    $max_price = isset( $_GET['max_price'] ) ? wc_clean( wp_unslash( $_GET['max_price'] ) ) : null; // WPCS: input var ok, CSRF ok.
    if ( ! wc()->query->get_main_query()->post_count && null === $min_price && null === $max_price ) {
        return;
    }

    wp_enqueue_script( 'wc-price-slider' );

    // Find min and max price in current result set.
    $prices = $this->get_filtered_price();
    $min    = floor( $prices->min_price );
    $max    = ceil( $prices->max_price );

    if ( $min === $max ) {
        return;
    }

    $this->widget_start( $args, $instance );

    if ( '' === get_option( 'permalink_structure' ) ) {
        $form_action = remove_query_arg( array( 'page', 'paged', 'product-page' ), add_query_arg( $wp->query_string, '', home_url( $wp->request ) ) );
    } else {
        $form_action = preg_replace( '%\/page/[0-9]+%', '', home_url( trailingslashit( $wp->request ) ) );
    }

    $min_price = null !== $min_price ? $min_price : apply_filters( 'woocommerce_price_filter_widget_min_amount', $min );
    $max_price = null !== $max_price ? $max_price : apply_filters( 'woocommerce_price_filter_widget_max_amount', $max );

    echo '<form method="get" action="' . esc_url( $form_action ) . '">
        <div class="price_slider_wrapper">
            <div class="price_slider" style="display:none;"></div>
            <div class="price_slider_amount">
                <input type="text" id="min_price" name="min_price" value="' . esc_attr( $min_price ) . '" data-min="' . esc_attr( apply_filters( 'woocommerce_price_filter_widget_min_amount', $min ) ) . '" placeholder="' . esc_attr__( 'Min price', 'woocommerce' ) . '" />
                <input type="text" id="max_price" name="max_price" value="' . esc_attr( $max_price ) . '" data-max="' . esc_attr( apply_filters( 'woocommerce_price_filter_widget_max_amount', $max ) ) . '" placeholder="' . esc_attr__( 'Max price', 'woocommerce' ) . '" />
                <button type="submit" class="button">' . esc_html__( 'Filter', 'woocommerce' ) . '</button>
                <div class="price_label" style="display:none;">
                    ' . esc_html__( 'Price:', 'woocommerce' ) . ' <span class="from"></span> &mdash; <span class="to"></span>
                </div>
                ' . wc_query_string_form_fields( null, array( 'min_price', 'max_price', 'paged' ), '', true ) . '
                <div class="clear"></div>
            </div>
        </div>
    </form>'; // WPCS: XSS ok.

    $this->widget_end( $args );
}
}

function My_Widget_price_filter_register() {
unregister_widget( 'WC_Widget_Price_Filter' );
register_widget( 'My_Widget_Price_Filter' );
add_action( 'widgets_init', 'My_Widget_price_filter_register' );
} 

1 Ответ

0 голосов
/ 08 апреля 2019

Вам необходимо расширить виджет Woocomerce, чтобы редактировать содержимое, а затем отменить регистрацию виджета по умолчанию для регистрации своего:

Class My_Widget_Price_Filter extends WC_Widget_Price_Filter {
    function widget( $args, $instance ) {

        /**
         * Output widget.
         *
         * @see WP_Widget
         *
         * @param array $args
         * @param array $instance
         */
        public function widget( $args, $instance ) {
            global $wp;

            if ( ! is_shop() && ! is_product_taxonomy() ) {
                return;
            }

            if ( ! wc()->query->get_main_query()->post_count ) {
                return;
            }

            wp_enqueue_script( 'wc-price-slider' );

            // Find min and max price in current result set.
            $prices = $this->get_filtered_price();
            $min    = floor( $prices->min_price );
            $max    = ceil( $prices->max_price );

            if ( $min === $max ) {
                return;
            }

            $this->widget_start( $args, $instance );

            if ( '' === get_option( 'permalink_structure' ) ) {
                $form_action = remove_query_arg( array( 'page', 'paged', 'product-page' ), add_query_arg( $wp->query_string, '', home_url( $wp->request ) ) );
            } else {
                $form_action = preg_replace( '%\/page/[0-9]+%', '', home_url( trailingslashit( $wp->request ) ) );
            }

            $min_price = isset( $_GET['min_price'] ) ? esc_attr( $_GET['min_price'] ) : apply_filters( 'woocommerce_price_filter_widget_min_amount', $min );
            $max_price = isset( $_GET['max_price'] ) ? esc_attr( $_GET['max_price'] ) : apply_filters( 'woocommerce_price_filter_widget_max_amount', $max );

            echo '<form method="get" action="' . esc_url( $form_action ) . '">
                <div class="price_slider_wrapper">
                    <div class="price_slider" style="display:none;"></div>
                    <div class="price_slider_amount">
                        <input type="text" id="min_price" name="min_price" value="' . esc_attr( $min_price ) . '" data-min="' . esc_attr( apply_filters( 'woocommerce_price_filter_widget_min_amount', $min ) ) . '" placeholder="' . esc_attr__( 'Min price', 'woocommerce' ) . '" />
                        <input type="text" id="max_price" name="max_price" value="' . esc_attr( $max_price ) . '" data-max="' . esc_attr( apply_filters( 'woocommerce_price_filter_widget_max_amount', $max ) ) . '" placeholder="' . esc_attr__( 'Max price', 'woocommerce' ) . '" />
                        <button type="submit" class="button">' . esc_html__( 'Filter', 'woocommerce' ) . '</button>
                        <div class="price_label" style="display:none;">
                            ' . esc_html__( 'Price:', 'woocommerce' ) . ' <span class="from"></span> &mdash; <span class="to"></span>
                        </div>
                        ' . wc_query_string_form_fields( null, array( 'min_price', 'max_price' ), '', true ) . '
                        <div class="clear"></div>
                    </div>
                </div>
            </form>';

            $this->widget_end( $args );
        }
    }
}

function my_widget_price_filter_register() {
    unregister_widget( 'WC_Widget_Price_Filter' );
    register_widget( 'My_Widget_Price_Filter' );
} add_action( 'widgets_init', 'my_widget_price_filter_register' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...