Добавьте пользовательский таксономический фильтр после фильтра категории товаров в списке продуктов Woocommerce Admin - PullRequest
0 голосов
/ 13 декабря 2018

В моей дочерней теме магазина woocommerce я добавил несколько таксономий.Теперь я хотел бы добавить несколько фильтров категорий для этих пользовательских таксономий.Я добавил такой фильтр, используя этот код (кредит: Rodolfo Melogli)

add_filter( 'woocommerce_product_filters', 'admin_filter_products_by_din' );
function admin_filter_products_by_din( $output ) {

  global $wp_query;

  $output .= wc_product_dropdown_categories( array(
    'show_option_all' => 'All DIN/ISO/ANSI',
    'taxonomy' => 'din-iso-ansi',
    'name' => 'din-iso-ansi',
    'order' => 'ASC',
    'tab_index' => '2',
    'selected' => isset( $wp_query->query_vars['din-iso-ansi'] ) ? $wp_query->query_vars['din-iso-ansi'] : '',
  ) );

  return $output;
}

Отображается новый фильтр категории, но теперь я хочу, чтобы размещение моего нового фильтра таксономии (DIN / ISO / ANSI) было измененопосле фильтра категорий товаров.

admin продукта:

product admin

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Я понял это с большой помощью LoicTheAztec, по сути используя большую часть его кода, но похоже, что мы не можем так просто заменить wp_dropdown_categories на wc_product_dropdown_categories .Изучив состав функции wc_product_dropdown_categories, я реализовал другой способ, чтобы эта функция не отображала результаты с помощью небольшого php.

add_filter( 'woocommerce_product_filters', 'admin_filter_products_by_din' );
function admin_filter_products_by_din( $output ) {

    global $wp_query;

    $taxonomy  = 'din-iso-ansi';
    $selected      = isset( $wp_query->query_vars[$taxonomy] ) ? $wp_query->query_vars[$taxonomy] : '';
    $info_taxonomy = get_taxonomy($taxonomy);

    ob_start(); // buffer the result of wc_product_dropdown_categories silently
    wc_product_dropdown_categories( array(
        'show_option_none' => __("Select a {$info_taxonomy->label}"), // changed
        'taxonomy'         => $taxonomy,
        'name'             => $taxonomy,
        //'echo'             => false, // <== Needed for in filter hook
        'tab_index'        => '2',
        'selected'         => $selected,
        'show_count'       => true,
        'hide_empty'       => true,
    ));
    $custom_dropdown = ob_get_clean();


    $before = '<select name="product_type"'; //

    $output = str_replace( $before, $custom_dropdown . $before, $output );

    return $output;
} 
0 голосов
/ 13 декабря 2018

Важные примечания:

  • wc_product_dropdown_categories() Вывод функции выводится по умолчанию и не удобен в ловушке фильтра, где всегда возвращаются все отфильтрованные данные, поэтомумы будем использовать аргумент 'echo', установленный на false.
  • wc_product_dropdown_categories(). На самом деле функция использует wp_dropdown_categories(), что более удобно для такой пользовательской таксономии, как ваша.

Для проверки вашего кода я использовал product_tag Пользовательскую таксономию Woocommerce, чтобы убедиться, что она работает.

Следующий код поместит ваш пользовательский фильтр в раскрывающемся списке сразу после категории продукта.фильтр:

add_filter( 'woocommerce_product_filters', 'admin_filter_products_by_din' );
function admin_filter_products_by_din( $output ) {
    global $wp_query;

    $taxonomy      = 'din-iso-ansi';
    $selected      = isset( $wp_query->query_vars[$taxonomy] ) ? $wp_query->query_vars[$taxonomy] : '';
    $info_taxonomy = get_taxonomy($taxonomy);

    $custom_dropdown = wp_dropdown_categories(array(
        'show_option_none' => __("Select a {$info_taxonomy->label}"), // changed
        'taxonomy'         => $taxonomy,
        'name'             => $taxonomy,
        'order'            => 'ASC',
        'echo'             => false, // <== Needed in a filter hook
        'tab_index'        => '2',
        'selected'         => $selected,
        'show_count'       => true,
        'hide_empty'       => true,
    ));

    $after = '<select name="product_type"'; // The start of the html output of product type filter dropdown.

    $output = str_replace( $after, $custom_dropdown . $after, $output );

    return $output;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы).Проверено и работает.

enter image description here

...