简码:图像在 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_src
return布尔值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);
我创建了一个扩展 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_src
return布尔值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);