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

Действия WooCommerce позволяют разработчикам добавлять или удалять код в основные плагины. Используя действия, разработчики могут расширить функциональные возможности WooCommerce. Действия могут использоваться для добавления сценариев конверсии в процесс оформления заказа, добавления информации на страницы магазина или продукта, добавления настраиваемых полей в заказы и действия в качестве триггеров для определенных событий.

Вот краткий список действий виджета WooCommerce:

  • woocommerce_after_widget_product_list: ядро WordPress woocommerce после перехвата списка продуктов виджета

Тип: фильтр

if (($ products = $ this- ›get_products ($ args, $ instance)) && $ products-› have_posts ()) {

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

echo apply_filters (‘woocommerce_before_widget_product_list’, ‘‹ ul class = »product_list_widget» ›’);

while ($ products- ›have_posts ()) {

$ products- ›the_post ();

wc_get_template (‘content-widget-product.php’, array (‘show_rating’ = ›false));

}

echo apply_filters (‘woocommerce_after_widget_product_list’, ‘‹/ul›’);

$ this- ›widget_end ($ args);

}

  • woocommerce_before_widget_product_list: ядро WordPress woocommerce перед списком продуктов виджета

Тип: фильтр

echo apply_filters (‘woocommerce_before_widget_product_list’, ‘‹ ul class = »product_list_widget» ›’);

  • woocommerce_layered_nav_link: Эта функция устанавливает глобальную переменную и выбирает термины таксономии и запрос.

Тип: фильтр

if (! empty ($ current_filter)) {

$ link = add_query_arg ($ filter_name, implode (‘,’, $ current_filter), $ link);

// Добавить тип запроса Arg в URL

if ($ query_type === ‘or’ &&! (1 === sizeof ($ current_filter) && $ option_is_set)) {

$ link = add_query_arg (‘query_type_’. sanitize_title (str_replace (‘pa_’, ‘’, $ taxonomy)), ‘or’, $ link);

}

}

echo ‘‹ li class = »wc-Layered-nav-term‘. ($ option_is_set? ‘selected’: ‘’). ‘« ›’;

эхо ($ count ›0 || $ option_is_set)? ‘‹ A href = ”’. esc_url (apply_filters (‘woocommerce_layered_nav_link’, $ link)). '">' : '';

echo esc_html ($ term- ›имя);

эхо ($ count ›0 || $ option_is_set)? ‘‹/A›’: ‘‹/span›’;

echo ‘‹ span class = »count» ›(‘. absint ($ count). ‘) ‹/span› ‹/li›»;

  • woocommerce_price_filter_meta_keys: получите отфильтрованную минимальную цену для текущих продуктов.

Тип: фильтр

$ meta_query = новый WP_Meta_Query ($ meta_query);

$ tax_query = новый WP_Tax_Query ($ tax_query);

$ meta_query_sql = $ meta_query- ›get_sql (« сообщение », $ wpdb-› сообщения, «ID»);

$ tax_query_sql = $ tax_query- ›get_sql ($ wpdb-› posts, «ID»);

$ sql = «ВЫБРАТЬ min (CAST (price_meta.meta_value AS UNSIGNED)) как min_price, max (CAST (price_meta.meta_value AS UNSIGNED)) как max_price FROM {$ wpdb-› posts} »;

$ sql. = «LEFT JOIN {$ wpdb-› postmeta} as price_meta ON {$ wpdb- ›posts} .ID = price_meta.post_id«. $ tax_query_sql ["присоединиться"]. $ meta_query_sql ["присоединиться"];

$ sql. = «ГДЕ {$ wpdb-› posts} .post_type = ‘product’ »

И {$ wpdb- ›posts} .post_status =« опубликовать »

И price_meta.meta_key IN (‘“. Implode (“‘, ’”, array_map (‘esc_sql’, apply_filters (‘woocommerce_price_filter_meta_keys’, array (‘_price’))). “‘).

И price_meta.meta_value ›‘ ’«;

$ sql. = $ tax_query_sql [‘где’]. $ meta_query_sql [‘где’];

return $ wpdb- ›get_row ($ sql);

  • woocommerce_price_filter_widget_max_amount: Максимальное количество виджета ценового фильтра WordPress Core woocommerce

Тип: фильтр

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’, $ мин.)). ‘« Placeholder = »’. esc_attr __ («Минимальная цена», «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 __ («Макс. цена», «woocommerce»). ‘“ / ›

‹Button type =” submit ”class =” button ”› ’. __ («Фильтр», «woocommerce»). '

‹Div class =" price_label "style =" display: none; "›

‘. __ (‘Price:’, ‘woocommerce’). ‘‹ Span class = »от» ›‹/span›‹ span class = »до» ›‹/span›

‹/Div›

‘. $ fields. ‘

‹Div class =” clear ”› ‹/div›

‹/Div›

‹/Div›

';

  • woocommerce_price_filter_widget_min_amount: Определите обратный вызов минимальной суммы виджета ценового фильтра woocommerce.

Тип: фильтр

$ list_args [‘walker’] = новый WC_Product_Cat_List_Walker;

$ list_args [‘title_li’] = ‘’;

$ list_args [‘pad_counts’] = 1;

$ list_args [‘show_option_none’] = __ («Нет категорий продуктов.», «woocommerce»);

$ list_args [‘current_category’] = ($ this- ›current_cat)? $ this- ›current_cat-› term_id: ‘’;

$ list_args [‘current_category_ancestors’] = $ this- ›cat_ancestors;

echo ‘‹ ul class = »категории товаров» ›’;

wp_list_categories (apply_filters (‘woocommerce_product_categories_widget_args’, $ list_args));

эхо ‘‹/ul›’;

  • woocommerce_product_categories_widget_args: Перехват аргументов виджета категорий продуктов woocommerce ядра WordPress

Тип: фильтр

$ list_args [‘walker’] = новый WC_Product_Cat_List_Walker;

$ list_args [‘title_li’] = ‘’;

$ list_args [‘pad_counts’] = 1;

$ list_args [‘show_option_none’] = __ («Нет категорий товаров.», «woocommerce»);

$ list_args [‘current_category’] = ($ this- ›current_cat)? $ this- ›current_cat-› term_id: ‘’;

$ list_args [‘current_category_ancestors’] = $ this- ›cat_ancestors;

echo ‘‹ ul class = »категории товаров» ›’;

wp_list_categories (apply_filters (‘woocommerce_product_categories_widget_args’, $ list_args));

эхо ‘‹/ul›’;

  • woocommerce_product_categories_widget_dropdown_args: Аргументы раскрывающегося списка виджетов категорий продуктов WordPress Core woocommerce.

Тип: фильтр

if ($ dropdown) {

$ dropdown_defaults = массив (

‘Show_count’ = ›$ count,

‘Ierarchical ’=› $ иерархический,

‘Show_uncategorized’ = ›0,

‘Orderby’ = ›$ orderby,

‘Selected’ = ›$ this-› current_cat? $ this- ›current_cat-› slug: ‘’

);

$ dropdown_args = wp_parse_args ($ dropdown_args, $ dropdown_defaults);

// Зацикливаемся на этом, пока не исправим https://core.trac.wordpress.org/ticket/13258

wc_product_dropdown_categories (apply_filters (‘woocommerce_product_categories_widget_dropdown_args’, $ dropdown_args));

wc_enqueue_js («

jQuery (‘.dropdown_product_cat’) .change (function () {

if (jQuery (this) .val ()! = ‘’) {

var this_page = ‘’;

var home_url = ‘“. esc_js (home_url (‘/’)). «‘;

if (home_url.indexOf (‘?’) ›0) {

this_page = home_url + ‘& product_cat =’ + jQuery (this) .val ();

} еще {

this_page = home_url + ‘? product_cat =’ + jQuery (this) .val ();

}

location.href = this_page;

}

});

“ );

// Список

}

  • woocommerce_product_categories_widget_product_terms_args: Виджет категорий продуктов WordPress Core woocommerce термины продукта args hook

Тип: фильтр

$ this- ›current_cat = false;

$ this- ›cat_ancestors = array ();

if (is_tax (‘product_cat’)) {

$ this- ›current_cat = $ wp_query-› queried_object;

$ this- ›cat_ancestors = get_ancestors ($ this-› current_cat- ›term_id,‘ product_cat ’);

} elseif (is_singular (‘product’)) {

$ product_category = wc_get_product_terms ($ post- ›ID,‘ product_cat ’, apply_filters (‘ woocommerce_product_categories_widget_product_terms_args ’, array (‘ orderby ’=› ‘parent’)));

if (! empty ($ product_category)) {

$ this- ›current_cat = end ($ product_category);

$ this- ›cat_ancestors = get_ancestors ($ this-› current_cat- ›term_id,‘ product_cat ’);

}

}

  • woocommerce_product_tag_cloud_widget_args: Перехват аргументов виджета облака тегов продукта WordPress Core woocommerce

Тип: фильтр

echo ‘‹ div class = ”tagcloud” ›’;

wp_tag_cloud (apply_filters (‘woocommerce_product_tag_cloud_widget_args’, массив (

‘Taxonomy’ = ›$ current_taxonomy,

‘Topic_count_text_callback’ = ›массив ($ this,‘ _topic_count_text ’),

) ) );

эхо ‘‹/div›’;

  • woocommerce_products_widget_query_args: ловушка args запроса виджета продуктов woocommerce ядра WordPress

Тип: фильтр

публичная функция get_products ($ args, $ instance) {

$ число =! пусто ($ instance [‘number’])? абсент ($ instance [‘number’]): $ this- ›settings [‘ number ’] [‘ std ’];

$ show =! пусто ($ instance [‘show’])? sanitize_title ($ instance [‘show’]): $ this- ›settings [‘ show ’] [‘ std ’];

$ orderby =! пустой ($ instance [‘orderby’])? sanitize_title ($ instance [‘orderby’]): $ this- ›settings [‘ orderby ’] [‘ std ’];

$ заказ =! пусто ($ instance [‘order’])? sanitize_title ($ instance [‘order’]): $ this- ›settings [‘ order ’] [‘ std ’];

$ query_args = массив (

‘Posts_per_page’ = ›$ number,

‘Post_status’ = ›‘ опубликовать ’,

‘Post_type’ = ›‘ product ’,

‘No_found_rows’ = ›1,

‘Order’ = ›$ order,

‘Meta_query’ = ›array ()

);

if (empty ($ instance [‘show_hidden’])) {

$ query_args [‘meta_query’] [] = WC () - ›query-› visibility_meta_query ();

$ query_args [‘post_parent’] = 0;

}

if (! empty ($ instance [‘hide_free’])) {

$ query_args [‘meta_query’] [] = array (

‘Key’ = ›‘ _price ’,

‘Value’ = ›0,

‘Compare’ = ›‘ ›’,

‘Type’ = ›‘ DECIMAL ’,

);

}

$ query_args [‘meta_query’] [] = WC () - ›query-› stock_status_meta_query ();

$ query_args [‘meta_query’] = array_filter ($ query_args [‘meta_query’]);

switch ($ show) {

case "Featured":

$ query_args [‘meta_query’] [] = array (

‘Key’ = ›‘ _featured ’,

‘Value’ = ›‘ yes ’

);

ломать;

case «onsale»:

$ product_ids_on_sale = wc_get_product_ids_on_sale ();

$ product_ids_on_sale [] = 0;

$ query_args [‘post__in’] = $ product_ids_on_sale;

ломать;

}

switch ($ orderby) {

case «цена»:

$ query_args [‘meta_key’] = ‘_price’;

$ query_args [‘orderby’] = ‘meta_value_num’;

ломать;

case ‘rand’:

$ query_args [‘orderby’] = ‘rand’;

ломать;

case «продажи»:

$ query_args [‘meta_key’] = ‘total_sales’;

$ query_args [‘orderby’] = ‘meta_value_num’;

ломать;

дефолт :

$ query_args [‘orderby’] = ‘date’;

}

вернуть новый WP_Query (apply_filters (‘woocommerce_products_widget_query_args’, $ query_args));

}

  • woocommerce_rating_filter_link: Перехватчик ссылки фильтра рейтинга woocommerce ядра WordPress

Тип: фильтр

echo ‘‹ li class = »wc-Layered-nav-rating‘. (! empty ($ _GET [‘min_rating’]) && $ rating === absint ($ _GET [‘min_rating’])? ‘selected’: ‘’). ‘« ›’;

echo ‘‹ a href = ”’. esc_url (apply_filters (‘woocommerce_rating_filter_link’, $ link)). ‘« ›’;

echo ‘‹ span class = »star-rating» title = »’. esc_attr (sprintf (__ («Оценка% s и выше», «woocommerce»), $ rating)). ‘“ ›

‹Span style =” width: ’. esc_attr (($ рейтинг / 5) * 100). ‘%” ›’. sprintf (__ («Оценка% s и выше», «woocommerce»), $ rating). '

‹/Span› (‘. Esc_html ($ count).‘) ’;

эхо ‘‹/a›’;

эхо ‘‹/li›’;

  • woocommerce_widget_cart_is_hidden: Корзина виджетов woocommerce в WordPress Core скрыта.

Тип: фильтр

виджет публичной функции ($ args, $ instance) {

if (apply_filters (‘woocommerce_widget_cart_is_hidden’, is_cart () || is_checkout ())) {

возвращение;

}

$ hide_if_empty = empty ($ instance [‘hide_if_empty’])? 0: 1;

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

if ($ hide_if_empty) {

echo ‘‹ div class = ”hide_cart_widget_if_empty” ›’;

}

// Вставить заполнитель виджета корзины - код в woocommerce.js обновит его при загрузке страницы

echo ‘‹ div class = ”widget_shopping_cart_content” ›‹/div›’;

if ($ hide_if_empty) {

эхо ‘‹/div›’;

}

$ this- ›widget_end ($ args);

}

Вывод

В этой статье я обсудил концепцию хуков виджетов WooCommerce и то, как эта концепция используется в разработке WooCommerce.

Первоначально опубликовано на www.cloudways.com 13 декабря 2016 г.