在Woocommerce中切换语句和自定义短代码问题

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

我正在一家Woocommerce商店工作,在产品页面上,我想通过在文本编辑器中放置一个短代码来显示多个图像。图像是有条件的,只有在被调用的属性包含特定值时才会显示。我能够创建这样一个函数,使用switch语句查找值并显示图像(如果值存在)。

这是代码 - 它放在我的子主题中的functions.php中。

   function display_colors_pic_sp() {
        $product = wc_get_product();
        $terms = get_terms("pa_color");
        foreach($terms as $term)
            switch ($term->name) {
                case "Blue RAL 5003":
                    echo '<img src="https://example.dk/wp-content/uploads/2019/04/RAL_5003_1024x1024-1.jpg">';
                break;

                case "Blue RAL 5010":
                    echo '<img src="example.dk/wp-content/uploads/2019/04/RAL_5003_1024x1024-1.jpg">';
                break;

                case "Blue RAL 5013":
                    echo '<img src="https:example.dk/wp-content/uploads/2019/04/RAL_5013_e5005376-6410-479a-b526-f23ca5f13cb3_1024x1024.jpg">';
                break;

                case "Green RAL 6007":
                    echo '<img src="https://example.dk/wp-content/uploads/2019/04/RAL_6007_1024x1024.jpg">';
                break;

                case "Grey RAL 7021":
                    echo '<img src="https://example.dk/wp-content/uploads/2019/04/RAL_7032_1024x1024.jpg">';
                break;

                case "Grey RAL 7035":
                    echo '<img src="https://example.dk/wp-content/uploads/2019/04/RAL_7035_f0d32a8d-7aac-45a8-97ec-cd46c8e35daf_1024x1024.jpg">';
                break;

                case "Black RAL 9005":
                    echo '<img src="https://example.dk/wp-content/uploads/2019/04/RAL_9005_61462eeb-8b3d-4792-909b-fdb549d47e80_1024x1024.jpg">';
                break;

                case "White RAL 9010":
                    echo '<img src="https://example.dk/wp-content/uploads/2019/04/RAL_9010_f80b4432-ba58-4377-821a-8ee8832a8610_1024x1024.jpg">';
                break;

            }


        }

    add_shortcode('colorpic', 'display_colors_pic_sp');

它的工作方式与它应该的方式非常相似,并根据值显示所有图像,但出于某种原因,无论我在何处放置短代码。它出现在页面顶部,就在标题后面,无论我放置短代码的位置。我有另一个短代码,它做了别的事情,这个我可以选择位置,我把短代码放在哪里。

注意:如果我更改echo以返回,则短代码会出现在我希望它出现的位置。但是它只出于某种原因显示第一个案例,而不是也包含值的其他案例。我也试过删除“休息”;在每个案件之后。

我会很高兴如果有人有时间并愿意帮助我,并找出为什么短代码位于页面顶部,而不是短代码的位置。

php wordpress woocommerce switch-statement shortcode
2个回答
0
投票

使用短代码时,一切都需要始终返回,但从不回显(或打印)......

此外,由于WordPress 4.5.0使用get_terms()函数,分类法应该总是通过$ args数组中的'taxonomy'参数传递。

所以你可以做的是用这种方式使用php ob_start()函数打开缓冲:

function display_colors_pic_sp() {
    ob_start(); // Start buffering

    $path = content_url('/uploads/2019/04/');

    foreach( get_terms( array('taxonomy' => 'pa_color') ) as $term) {
        switch ($term->name) {
            case "Blue RAL 5003":
                echo '<img src="'.$path.'RAL_5003_1024x1024-1.jpg">';
            break;

            case "Blue RAL 5010":
                echo '<img src="'.$path.'RAL_5003_1024x1024-1.jpg">';
            break;

            case "Blue RAL 5013":
                echo '<img src="'.$path.'RAL_5013_e5005376-6410-479a-b526-f23ca5f13cb3_1024x1024.jpg">';
            break;

            case "Green RAL 6007":
                echo '<img src="'.$path.'RAL_6007_1024x1024.jpg">';
            break;

            case "Grey RAL 7021":
                echo '<img src="'.$path.'RAL_7032_1024x1024.jpg">';
            break;

            case "Grey RAL 7035":
                echo '<img src="'.$path.'RAL_7035_f0d32a8d-7aac-45a8-97ec-cd46c8e35daf_1024x1024.jpg">';
            break;

            case "Black RAL 9005":
                echo '<img src="'.$path.'RAL_9005_61462eeb-8b3d-4792-909b-fdb549d47e80_1024x1024.jpg">';
            break;

            case "White RAL 9010":
                echo '<img src="'.$path.'RAL_9010_f80b4432-ba58-4377-821a-8ee8832a8610_1024x1024.jpg">';
            break;
        }
    }
    return ob_get_clean(); // Return buffered content
}
add_shortcode('colorpic', 'display_colors_pic_sp');

代码位于活动子主题(或活动主题)的function.php文件中。测试和工作。


0
投票

因为它在返回时起作用意味着框架调用它想要的函数并期望你返回它的值以放置在适当的位置。如果你调用echo,它会立即将值发送到输出,但这不会起作用。

您可以将要包含的所有HTML附加到变量中并返回该变量并解决问题。所以像这样:

function display_colors_pic_sp() {
    $ret = "";
    $product = wc_get_product();
    $terms = get_terms("pa_color");
    foreach($terms as $term)
        switch ($term->name) {
          case "Blue RAL 5003":
             $ret .= '<img src="https://example.dk/wp-content/uploads/2019/04/RAL_5003_1024x1024-1.jpg">';
             break;
          case "Blue RAL 5010":
             $ret .= '<img src="example.dk/wp-content/uploads/2019/04/RAL_5003_1024x1024-1.jpg">';
             break;
      ...
    return $ret;
}
© www.soinside.com 2019 - 2024. All rights reserved.