在Woocommerce中更改Shortcode包装器

时间:2014-01-31 14:43:29

标签: wrapper woocommerce shortcode

我正在使用Wordpress 3.8 + Woocommerce 2.0 我需要更改Woocommerce在使用短代码时生成的包装类。

我使用这个短代码:[recent_products per_page =“12”] 输出是:

<div class="woocommerce">
   the_product_loop....
</div>

我想获得

<div class="MYCUSTOMCLASS">
   the_product_loop....
</div>

但是我找不到我需要更改代码的地方...... 在class-wc-shortcodes.php文件中,我找到了生成包装器的函数声明:

public static function shortcode_wrapper(
    $function,
    $atts    = array(),
    $wrapper = array(
        'class'  => 'woocommerce',
        'before' => null,
        'after'  => null
    )
)

但是......我不想改变Woocommerce插件的核心文件,可以通过functions.php定义我的自定义类吗?

2 个答案:

答案 0 :(得分:4)

你可以创建自己的短代码,只是默认代码的克隆,但是有了这个改变,所以将它粘贴到你的functions.php中:

function custom_recent_products_FX($atts) {
    global $woocommerce_loop, $woocommerce;

    extract(shortcode_atts(array(
        'per_page'  => '12',
        'columns'   => '4',
        'orderby' => 'date',
        'order' => 'desc'
    ), $atts));

    $meta_query = $woocommerce->query->get_meta_query();

    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'ignore_sticky_posts'   => 1,
        'posts_per_page' => $per_page,
        'orderby' => $orderby,
        'order' => $order,
        'meta_query' => $meta_query
    );

    ob_start();

    $products = new WP_Query( $args );

    $woocommerce_loop['columns'] = $columns;

    if ( $products->have_posts() ) : ?>

        <?php woocommerce_product_loop_start(); ?>

            <?php while ( $products->have_posts() ) : $products->the_post(); ?>

                <?php woocommerce_get_template_part( 'content', 'product' ); ?>

            <?php endwhile; // end of the loop. ?>

        <?php woocommerce_product_loop_end(); ?>

    <?php endif;

    wp_reset_postdata();

    return '<div class="MY_CUSTOM_CLASS">' . ob_get_clean() . '</div>';
 }
 add_shortcode('custom_recent_products','custom_recent_products_FX');

请注意该功能结束时的“MY_CUSTOM_CLASS”,根据您的需要进行更改。

这将创建一个新的短代码,几乎与“recent_products”短代码相同,但只有更改。

所以输出这个,只需在模板上使用:

 echo do_shortcode('[custom_recent_products per_page="3"]');

或在你的帖子中:

 [custom_recent_products per_page="3"]

我不知道这是否是最好的方法,但是对于我能看到的内容,“woocommerce”类直接在recent_products短代码函数上以html形式返回,所以我无法想象如何过滤或钩住这个另一方面。

希望有帮助,对不起我的坏英语:)

答案 1 :(得分:0)

you can use following trick to over right wrapper function :
Here i have created a shortcode for checkout and shortcode and change wrapper
shortcode will be [overright_checkout_of_shortcode] 
function shortcode_handler($atts) {
    $classget=new WC_Shortcodes();
    $wrapper = array(
            'class'  => '',
            'before' => '<div id="accordion" class="panel-group faq_group checkout-group" role="tablist" aria-multiselectable="true" >',
            'after'  => '</div>'
        );
  return $classget->shortcode_wrapper( array( 'WC_Shortcode_Checkout', 'output' ), $atts ,$wrapper);
 }
add_shortcode('overright_checkout_of_shortcode','shortcode_handler');