Настройка виджета WordPress – категория продуктов

Я хочу добавить некоторые настраиваемые маркеры рядом с моими категориями в своем виджете категории, поэтому я создал новый виджет и добавил в свой новый html и классы, чтобы я мог изменить, как все выглядит. К сожалению, по какой-то причине мой виджет добавляет ссылку на одну из моих последних категорий по всем страницам магазина, а также там, где она должна быть (в списке категорий / боковой панели). В то время как все, кажется, работает, пустые теги повсюду помешают стилизации других элементов, добавляя дополнительное пространство и заставляя вещи сидеть.

Вот мой полный код виджета:

class mdk_wpcat_widget extends WP_Widget { // Set up the widget name and description. public function __construct() { $widget_options = array( 'classname' => 'mdk_wpcat_widget', 'description' => 'Custom MDK Woocommerce Category Widget' ); parent::__construct( 'mdk_wpcat_widget', 'Woo Cat Widget', $widget_options ); } // Create the widget output. public function widget( $args, $instance ) { $title = apply_filters( 'widget_title', $instance[ 'title' ] ); // before and after widget arguments are defined by themes //$blog_title = get_bloginfo( 'name' ); //$tagline = get_bloginfo( 'description' ); echo $args['before_widget'] . $args['before_title'] . $title . $args['after_title']; // Custom Woo Category Output $args = array( 'number' => $number, 'orderby' => 'menu_order', 'order' => 'ASC', 'hide_empty' => $hide_empty, 'include' => $ids ); //Hides "film" category by ID $args['exclude'] = '72'; $product_categories = get_terms( 'product_cat', $args ); $count = count($product_categories); if ( $count > 0 ){ echo '<ul class="shop-categories">'; foreach ( $product_categories as $product_category ) { echo '<li class="shop-category ' . (( $product_category->name == single_cat_title('', false) )?"active-cat":"") . '"><a href="' . get_term_link( $product_category ) . '"><span class="bulletpoint"></span><span class="category-title">' . $product_category->name . '</span></li>'; } echo '</ul>'; } echo $args['after_widget']; } // Create the admin area widget settings form. public function form( $instance ) { $title = ! empty( $instance['title'] ) ? $instance['title'] : ''; ?> <p> <label for="<?php echo $this->get_field_id( 'title' ); ?>">Title:</label> <input type="text" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo esc_attr( $title ); ?>" /> </p><?php } // Apply settings to the widget instance. public function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance[ 'title' ] = strip_tags( $new_instance[ 'title' ] ); return $instance; } } // Register the widget. function mdk_wpcat_load_widget() { register_widget( 'mdk_wpcat_widget' ); } add_action( 'widgets_init', 'mdk_wpcat_load_widget' ); 

Я знаю, что виджет вызывает проблему, потому что я могу удалить ее из моего файла functions.php, и все снова выглядит правильно. Я использую последнюю версию wp и woocommerce по состоянию на 7/5/2017, и я также пробовал в теме Twenty Seventeen, чтобы убедиться, что это не моя текущая тема.

Спасибо за помощь!

Взгляд на результат, отображаемый виджетом, показывает, что в разметке отсутствует закрывающий тег <a> для термина «ссылки», а экземпляр виджета не имеет закрытия </li> .

Просмотр источника страницы и форматирование вывода облегчают определение этих проблем:

 <li id="mdk_wpcat_widget-2" class="widget-container mdk_wpcat_widget"> <h3 class="widget-title">Wooooo!</h3> <ul class="shop-categories"> <li class="shop-category "> <a href="http://example.com/product-category/test-category-1/"> <span class="bulletpoint"></span> <span class="category-title">Test Category 1</span> </li> <li class="shop-category "> <a href="http://example.com/product-category/test-category-1/test-subcategory-1/"> <span class="bulletpoint"></span> <span class="category-title">Test Subcategory 1</span> </li> </ul> 

Вот обновленная версия кода, который выводит HTML. Форматирование было улучшено, а отсутствующий закрывающий якорный тэг был исправлен. Сохранение элементов в хорошем формате помогает выявлять ошибки.

 $count = count( $product_categories ); if ( $count > 0 ) { echo '<ul class="shop-categories">'; foreach ( $product_categories as $product_category ) { $active_cat = $product_category->name == single_cat_title( '', false ) ? ' active-cat' : ''; echo ' <li class="shop-category' . $active_cat . '">' . '<a href="' . esc_url( get_term_link( $product_category ) ) . '">' . '<span class="bulletpoint"></span>' . '<span class="category-title">' . esc_html( $product_category->name ) . '</span>' . '</a>' . '</li>'; } echo '</ul>'; } 

Отсутствующий закрывающий </li> для экземпляра виджета вызван перезаписью массива $args аргументами, переданными в get_terms() . Это вызывает echo $args['after_widget']; бросить предупреждение. Всегда включайте отчеты об ошибках при разработке.

Создайте отдельный массив для аргументов, переданных get_terms() :

 // Custom Woo Category Output $get_terms_args = array( 'number' => $number, 'orderby' => 'menu_order', 'order' => 'ASC', 'hide_empty' => $hide_empty, 'include' => $ids, 'exclude' => '72', //Hides "film" category by ID ); $product_categories = get_terms( 'product_cat', $get_terms_args ); 

Обратите внимание, что $number , $hide_empty и $ids тоже не определены, поэтому эти переменные должны быть правильно инициализированы.