1

注意:虽然这可能是一个简单的修复,但我是使用数组的新手并且完全被难住了。

我正在尝试通过 WordPress 中的选项 API 从简码数组中保存数据,然后调用该数组并使用该数据创建另一个数组以连接到插件的函数中。这是一个响应式滑块插件,我基本上是在尝试附加一个简码,这样我就可以在后端创建滑块并在前端显示它,简码如下所示:[responsive_slider slider_name="imageslider"].

实现文档可以在这里找到,这是我的代码:

function responsive_gallery_shortcode($atts, $content=null) {
    extract(shortcode_atts( array('slider_name' => 'product_page') , $atts));
    foreach ($slider_name as $value) {
        update_option('_unique_slider_name', $value );
    }
    if(function_exists('show_flexslider_rotator')) 
        echo show_flexslider_rotator( $slider_name );

    add_image_size( $slider_name , '550', '250', true );
}
add_shortcode('responsive_gallery', 'responsive_gallery_shortcode');        

if (!function_exists('custom_set_flexslider_hg_rotators')) {
    function custom_set_flexslider_hg_rotators() {
        $slider_name = get_option('_unique_slider_name');

        foreach ($slider_name as $value) { 
            $rotators = array();
            $rotators[ $value ] = array( 'size' => $value );    
            return $rotators;
        }   
    }  
} 
add_filter('flexslider_hg_rotators', 'custom_set_flexslider_hg_rotators', 9999);

我在两个函数上都收到“为 foreach() 提供的参数无效”错误。foreach在我有两个简码的页面上,两个错误都出现了两次。看起来好像$slider_name是一个字符串而不是一个数组,但必须有一种方法将它保存在update_option()函数中,以便它返回一个数组。我对数组很陌生,我肯定在这里挣扎。我已经花了几个小时在这方面,并且已经在 WordPress 方面获得了一些帮助,但我不太明白。

4

1 回答 1

1

由于短代码属性将作为字符串到达​​,您需要先将其转换为数组。

同时,由于它必须作为字符串传递,因此您需要使用分隔符来管理它。

对于所有这些,您将需要 PHP 函数explode

$string = "one,two";
$array = explode( ',', $string );
var_dump( $array );

结果是:

array (size=2)
  0 => string 'one' (length=3)
  1 => string 'two' (length=3)

$string = "one";
$array = explode( ',', $string );
var_dump( $array );

结果是:

array (size=1)
  0 => string 'one' (length=3)

PS:总是值得查阅 PHP 手册以及每个页面中的评论:http ://www.php.net/manual/en/language.types.array.php


[更新]
你的原代码有很多问题,查看这个修改版的评论:

function responsive_gallery_shortcode($atts, $content=null) {
    extract(shortcode_atts( array('slider_name' => 'product_page') , $atts));

    // Convert string into array
    // Using comma as separator when writing the shortcode in the post
    $array_slider = explode( ',', $slider_name );

    // YOU DON'T NEED A `foreach` HERE
    //foreach ($array_slider as $value) {
        update_option('_unique_slider_name', $array_slider );
    //}

    // I DON'T KNOW WHAT THIS FUNCTIONS DOES
    // But in any case, being $array_slider an array, maybe it should be inside a `foreach`
    if(function_exists('show_flexslider_rotator')) 
        echo show_flexslider_rotator( $array_slider );

    // THIS DOESN'T MAKE SENSE
    // You're not supposed to be adding images sizes at each Shortcode call
    // And you are dealing with an array
    add_image_size( $slider_name , '550', '250', true );
}
add_shortcode('responsive_gallery', 'responsive_gallery_shortcode');        

if (!function_exists('custom_set_flexslider_hg_rotators')) {
    function custom_set_flexslider_hg_rotators() {
        // The option was already saved as array, so we can work directly with it
        $slider_name = get_option('_unique_slider_name');

        // YOU DON'T WANT TO DECLARE THE VARIABLE AT EACH STEP OF THE LOOP
        $rotators = array();
        foreach ($slider_name as $value) { 
            $rotators[ $value ] = array( 'size' => $value );    
        }   
        // RETURN THE VALUE ONLY AFTER COMPLETING THE LOOP
        return $rotators;
    }  
    // PUT THE FILTER HOOK INSIDE if(!function_exists())
    add_filter('flexslider_hg_rotators', 'custom_set_flexslider_hg_rotators', 9999);
} 
于 2013-02-27T06:38:12.330 回答