【问题标题】:What's a safe way to declare a variable so I can call it from another script?什么是声明变量的安全方法,以便我可以从另一个脚本调用它?
【发布时间】:2011-10-02 03:33:12
【问题描述】:

我在 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 除了后一段代码的最后一项之外,还有更好的方法来添加逗号吗?

【问题讨论】:

  • 您确定$image_urls 已设置,还是循环出错?试试isset($image_urls)
  • 是的,我确定。使用 &lt;?php if(isset($image_urls)) echo 'yep!'; ?&gt; 它什么也没返回。
  • 能否请您发布整个脚本,以便我们查看在哪里。如果他们在同一页面上,这应该可以工作。如果它们在不同的页面上,我不知道你认为它会如何工作。
  • @walkerneo 它们位于两个页面上,由 Wordpress 的原生 get_footer() 方法连接起来,并作为一个 HTML 片段。所以我并不清楚这些页面是否会有单独的范围。
  • @IsaacLubow,哦,有道理。

标签: php wordpress scope


【解决方案1】:

要在多个脚本中安全地传递 $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 中添加前缀以表明它是您的。

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • 非常有帮助和彻底的答案。我今天学到了一些东西,伙计们!
    【解决方案3】:

    脚本看起来不错。

    不过,这样会更好:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2014-03-28
      • 2019-10-17
      • 2020-11-09
      相关资源
      最近更新 更多