WooCommerce店面过滤器的逆向工程

时间:2018-08-21 作者:Valentin Genev

早安,首先我想为这个更具理论性的问题道歉,但我迫切需要一个线索,而我的谷歌搜索没有导致任何结果。

我需要解释如何查找和编辑由以下函数生成的标记代码:

function storefront_product_categories( $args ) {

    if ( storefront_is_woocommerce_activated() ) {

        $args = apply_filters( \'storefront_product_categories_args\', array(
            \'limit\'             => 3,
            \'columns\'           => 3,
            \'child_categories\'  => 0,
            \'orderby\'           => \'name\',
            \'title\'             => __( \'Shop by Category\', \'storefront\' ),
        ) );

        $shortcode_content = storefront_do_shortcode( \'product_categories\', apply_filters( \'storefront_product_categories_shortcode_args\', array(
            \'number\'  => intval( $args[\'limit\'] ),
            \'columns\' => intval( $args[\'columns\'] ),
            \'orderby\' => esc_attr( $args[\'orderby\'] ),
            \'parent\'  => esc_attr( $args[\'child_categories\'] ),
        ) ) );

        /**
         * Only display the section if the shortcode returns product categories
         */
        if ( false !== strpos( $shortcode_content, \'product-category\' ) ) {

            echo \'<section class="storefront-product-section storefront-product-categories" aria-label="\' . esc_attr__( \'Product Categories\', \'storefront\' ) . \'">\';    
            do_action( \'storefront_homepage_before_product_categories\' );    
            echo \'<h2 class="section-title">\' . wp_kses_post( $args[\'title\'] ) . \'</h2>\';    
            do_action( \'storefront_homepage_after_product_categories_title\' );    

            echo $shortcode_content;

            do_action( \'storefront_homepage_after_product_categories\' );    
            echo \'</section>\';    
        }
    }
}
例如,此函数连接到do_action(\'homepage\');. 我成功地实现了我的功能并将其挂接到\'homepage\' 操作,但我找不到此行之后生成的标记echo $shortcode_content;; 我希望能够深入研究它,因为通常有一些代码块我想重用;本例中的类别缩略图。

我的问题是,更有经验的用户会如何处理这种情况?逆向工程时要搜索/寻找什么?

提前感谢您!

1 个回复
最合适的回答,由SO网友:user141080 整理而成

Storefront 是WooCommerce的电子商务主题。它是由WooCommerce和WooCommerce website 它显示为WooCommerce的“官方”主题。

好吧,这对我们意味着什么?

这个主题与WooCommerce之间的联系比其他大多数主题都要紧密。当您查看函数的代码时storefront_do_shortcodecall_user_func。

function storefront_do_shortcode( $tag, array $atts = array(), $content = null ) {
    global $shortcode_tags;
    if ( ! isset( $shortcode_tags[ $tag ] ) ) {
        return false;
    }
    return call_user_func( $shortcode_tags[ $tag ], $atts, $content, $tag );
}
PHP函数call_user_func 用于运行时的动态函数调用。此函数的第一个参数定义回调。如果我们扩展函数storefront_do_shortcode 通过输出$shortcode_tags[ $tag ], 我们可以“查看”该回调参数。

function storefront_do_shortcode( $tag, array $atts = array(), $content = null ) {
    global $shortcode_tags;

    if ( ! isset( $shortcode_tags[ $tag ] ) ) {
        return false;
    }

    if($tag == \'product_categories\' )
    {
        var_dump($shortcode_tags[ $tag ]);

        die();
    }


    return call_user_func( $shortcode_tags[ $tag ], $atts, $content, $tag );
}
输出为WC_Shortcodes::product_categories.

如果在店面主题的主题文件夹中搜索名为WC_Shortcodes, 您将发现没有具有此名称的类。

但是如果你在WooCommerce插件文件夹中搜索,你会找到这个类。

班级WC_Shortcodes 是WooCommerce定义其短代码和功能的地方product_categories 创建短代码。

要呈现分类数据,WooCommerce使用content-product_cat.php 样板该模板定义了一系列操作,可能其中一个可以帮助您。

结束