Как подробно работает ловушка фильтра woocommerce_loop_add_to_cart_link? - PullRequest
1 голос
/ 17 мая 2019

У меня есть некоторые основные вопросы по Woocommerce, и я не могу найти их где-либо в Интернете.

  • из приведенного ниже кода, откуда берется $ args?
  • как $ product и $ args присваивают% s?

спасибо!

global $product;

echo apply_filters( 'woocommerce_loop_add_to_cart_link', // WPCS: XSS ok.
    sprintf( '<a href="%s" data-quantity="%s" class="%s" %s>%s</a>',
        esc_url( $product->add_to_cart_url() ),
        esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 ),
        esc_attr( isset( $args['class'] ) ? $args['class'] : 'button' ),
        isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '',
        esc_html( $product->add_to_cart_text() )
    ),
$product, $args );

1 Ответ

1 голос
/ 17 мая 2019

1) Пояснения к переменной $ args в файле шаблона loop/add_to_cart.php:

Код вашего вопроса взят из файла шаблона loop/add_to_cart.php.
Он вызывается content-product.php файлом шаблона на woocommerce_after_shop_loop_item hook:

/**
 * Hook: woocommerce_after_shop_loop_item.
 *
 * @hooked woocommerce_template_loop_product_link_close - 5
 * @hooked woocommerce_template_loop_add_to_cart - 10
 */
do_action( 'woocommerce_after_shop_loop_item' );

Как вы можете видеть функцию шаблона woocommerce_template_loop_add_to_cart() выполняет эту работу и находится в плагине WooCommerce под includes/wc-template-functions.php.

Поэтому аргументы по умолчанию:

$defaults = array(
    'quantity'   => 1,
    'class'      => implode(
        ' ',
        array_filter(
            array(
                'button',
                'product_type_' . $product->get_type(),
                $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
                $product->supports( 'ajax_add_to_cart' ) && $product->is_purchasable() && $product->is_in_stock() ? 'ajax_add_to_cart' : '',
            )
        )
    ),
    'attributes' => array(
        'data-product_id'  => $product->get_id(),
        'data-product_sku' => $product->get_sku(),
        'aria-label'       => $product->add_to_cart_description(),
        'rel'              => 'nofollow',
    ),
);

Они анализируются через ловушку фильтра woocommerce_loop_add_to_cart_args:

$args = apply_filters( 'woocommerce_loop_add_to_cart_args', wp_parse_args( $args, $defaults ), $product );

… позволяющий вносить изменения в эти аргументы.

Переменная $args в woocommerce_loop_add_to_cart_link сделана из этого.


2) Как $productи $args присваиваются %s:

Это относится к PHP printf() и sprintf() функция , где каждый %s является заполнителем .

В '<a href="%s" data-quantity="%s" class="%s" %s>%s</a>':

  • 1-й заполнитель %s будет заменен на esc_url( $product->add_to_cart_url() )
  • 2-й заполнитель %s на esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 )
  • and so on…

Документация для printf() и sprintf() php функций.

...