woocommerce_loop_add_to_cart_link 过滤器挂钩如何深入工作?

问题描述 投票:0回答:2

我有一些基本的 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 );
php wordpress woocommerce product hook-woocommerce
2个回答
9
投票

1) 模板文件中$args变量的说明

loop/add_to_cart.php
:

您问题中的代码来自模板文件

loop/add_to_cart.php

它由
content-product.php
钩子上的
woocommerce_after_shop_loop_item
模板文件调用:

/**
 * 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()
完成了这项工作,它位于
includes/wc-template-functions.php
下的 WooCommerce 插件中。

所以默认参数是:

$defaults = array(
    'quantity'   => 1,
    'class'      => implode(
        ' ',
        array_filter(
            array(
                'button',
                wc_wp_theme_get_element_class_name( 'button' ), // escaped in the template.
                '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(),
        'aria-describedby' => $product->add_to_cart_aria_describedby(),
        '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
变量
就是由它组成的。


  1. 如何将
    $product
    $args
    分配给
    %s
    :

这是特定于 PHP

printf()
sprintf()
函数 ,其中每个
%s
都是占位符

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

  • 第一个占位符
    %s
    将替换为
    esc_url( $product->add_to_cart_url() )
  • 第二个占位符
    %s
    作者:
    esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 )
  • and so on…

printf()
sprintf()
php 函数的文档。


1
投票

这是我实际更改 $args 的方法:

add_filter( 'woocommerce_loop_add_to_cart_args', 'filter_woocommerce_loop_add_to_cart_args', 10, 2 );
function filter_woocommerce_loop_add_to_cart_args( $args, $product ) {
    $args['quantity'] = 6;
    return $args;
}
© www.soinside.com 2019 - 2024. All rights reserved.