声明变量的安全方法是什么,所以我可以从另一个脚本调用它?

时间:2011-10-02 03:33:13

标签: php wordpress scope

我在Wordpress模板页面上构建了一系列图像URL,如下所示:

<?php $attachments = get_posts(array(
        'order'          => 'ASC',
        'post_type'      => 'attachment',
        'post_parent'    => $post->ID,
        'post_mime_type' => 'image',
        'post_status'    => null,
        'numberposts'    => -1,
    ));
    if ($attachments) {
        //set up array of urls
        $image_urls = array();
        foreach($attachments as $attachment){
            $image_object = wp_get_attachment_image_src($attachment->ID,'full');
            $image_urls[] = $image_object[0];
        }
    } ?>

然后,在footer.php中,我想像这样打印Javascript数组:

<script>
var images = [<?php $num_urls = count($image_urls);
                    $num = 1;
                    foreach($image_urls as $image_url) {
                        echo $image_url;
                        $num++;
                        if($num<$num_urls) echo ', ';
                    } ?>];
</script>

我错误地认为,在连接模板页面和footer.php时,PHP会将脚本视为连续的,并记住变量值,但事实并非如此,因为它返回:

  

警告:为foreach()提供的参数无效

如何声明$image_urls数组以便以后可以引用它,而不会出现作用域/命名空间危险?

PS 除了后一段代码中的最后一项之外,还有更好的方法来添加逗号吗?

3 个答案:

答案 0 :(得分:3)

要在多个脚本中安全地传递$ image_urls,请按以下方式声明:

$GLOBALS['image_urls'] = array();
foreach($attachments as $attachment){
    $image_object = wp_get_attachment_image_src($attachment->ID,'full');
    $GLOBALS['image_urls'][] = $image_object[0];
}

后来,引用它:

<script>
var images = [<?php $num_urls = count($GLOBALS['image_urls']);
                $num = 1;
                foreach($GLOBALS['image_urls'] as $image_url) {
                    echo $image_url;
                    $num++;
                    if($num<$num_urls) echo ', ';
                } ?>];
</script>

为确保不与任何内容发生冲突,您可以为image_urls添加前缀,以表明它是您的。

答案 1 :(得分:2)

脚本看起来很好。

尽管如此,这会更好:

<script>
var images = [<?php echo implode(',',$image_urls) ?>];
</script>

答案 2 :(得分:2)

  

我错误地认为,在连接模板页面和footer.php时,PHP会将脚本视为连续的,并记住变量值

它应该,除非Wordpress以这种方式是奇数,或者除非变量在函数范围内(在任一文件中)。如果是这样,请添加此声明:

global $image_urls;

位于函数的顶部。 或者,通过$ GLOBALS引用$ image_urls到处。如,

$GLOBALS['image_urls'][] = $image_object[0];
  

除了后一段代码中的最后一项之外,还有更好的方法来添加逗号吗?

使用内爆功能:

echo implode(', ', $image_urls);

我认为你们每个项目都需要引用,所以:

if (count($image_urls)) {
    echo '"' . implode('", "' $image_urls) . '"';
}

或者,一般来说,我会为这种类型的循环执行类似的操作:

$first = true;
foreach (...) {
    if ($first) $first = false; else echo ', ';
    echo $item;
}