简码:图像在 explode() 后未返回

Shortcode: Images not being returned after explode()

我创建了一个扩展 WPBakery 插件的自定义元素。这个自定义元素将是一个图像滑块。用户从单个后端选项中选择他们想要的图像数量,然后图像将被分解 (explode()),返回并显示图像 - 无论如何就是这个想法。

但是,我不明白为什么我的图片没有被归还?前端正在渲染周围的内容,但是这些图像的 src 所在的 li 是空的。另外,我在后端选择了三张图片,但其中一张 li 正在渲染。

这是完整的标记:

<?php 
if ( ! defined( 'ABSPATH' ) ) {
    die( '-1' );
}

class vcImageCarousel extends WPBakeryShortCode {

    function __construct() {
        add_action( 'init', array( $this, 'vc_imageCarousel_mapping' ) );
        add_shortcode( 'vc_imageCarousel', array( $this, 'vc_imageCarousel_html' ) );
    }

    vc_map( 
        array(
            'name' => __('Image Carousel', 'text-domain'),
            'base' => 'vc_imageCarousel',
            'description' => __('Image Carousel', 'text-domain'), 
            'params' => array(
                array(
                    'type' => 'attach_images',
                    'heading' => esc_html__("Images"),
                    'param_name' => 'image',
                    'value' => esc_html__(''),
                    'admin_label' => false,
                    'weight' => 0,
                    'group' => __( 'Content', 'my-text-domain' ),
                )  
            )
        )
    );

    public function vc_imageCarousel_html( $atts ) {

        extract(
            shortcode_atts(
                array(
                    'id'                    => '',
                    'class'                 => '',
                ), 
                $atts
            )
        );

        // map background image attributes
        $image = shortcode_atts(
            array(
                'image' => 'image',
            ), 
            $atts 
        );

        $image_ids=explode(',',$image['image']);


        $result = "<div class='imageCarousel'>";
        $result .= "<div class='imageCarousel__container justify-content-center'>";
        $result .= "<ul>";

        foreach( $image_ids as $image_id ){
            $result .='<li>';
            $result .= var_dump($image_id);
            $result .= wp_get_attachment_image_src( $image_id, 'full' );
            $result .='</li>';
        }

        $result .= "</ul>";
        $result .= "</div>";
        $result .= "</div>";

        return $result;


    }

}

new vcImageCarousel(); ?>

A var_dump($image_id) returns string(5) "image".

var_dump 函数没有 return 任何东西,但它直接将结果输出到浏览器,所以语句 $result .= var_dump($image_id); 没有做任何事情。

还有一个问题:wp_get_attachment_image_srcreturn布尔值false或者数组。因此,如果一个数组是 returned,你会有一个数组到字符串的隐式转换,至少会导致通知。

作为初学者,我建议像这样重构您的 foreach 循环:

foreach( $image_ids as $image_id ){
        $result .='<li>';
        $result .= $image_id;
        $attachmentImage = wp_get_attachment_image_src( $image_id, 'full' );
        $result .= $attachmentImage ? $attachmentImage['url'] : '';
        $result .='</li>';
    }

如果您绝对想将 var_dump 的结果分配给您的 $result 变量,您可以按如下方式使用输出缓冲:

ob_start();
var_dump($image_id);
$result .= ob_get_clean();

ob_start函数开始缓冲输出,而ob_get_clean获取输出缓冲区的内容,然后将其删除。

我在我的一个项目中使用它来记录日志。本函数returns将var_dump内容转化为字符串:

function varDumpToString($stuff = null) {
  ob_start();
  var_dump($stuff);
  $ret = ob_get_contents();
  ob_end_clean();
  return $ret;
}

所以只需替换这个:

$result .= var_dump($image_id);

有了这个

$result .= varDumpToString($image_id);