【问题标题】:Losing reference to $_post variable?失去对 $_post 变量的引用?
【发布时间】:2010-03-26 14:55:33
【问题描述】:

在下面的代码中,顶部的 echo 返回 true,但底部的 echo 什么也不返回。显然,中间的代码导致我丢失了对 $_post 变量的引用?

<?php
echo "in category: ".in_category('is-sidebar'); //RETURNS TRUE
if (!get_option('my_hide_recent'))
{
    $cat=get_cat_ID('top-menu'); 
    $catHidden=get_cat_ID('hidden');
    $myquery = new WP_Query();
    $myquery->query(array(
        'cat' => "-$cat,-$catHidden",
        'post_not_in' => get_option('sticky_posts')
    ));
    $myrecentpostscount = $myquery->found_posts;
    if ($myrecentpostscount > 0) 
    { ?>
    <div class="menu"><h4><?php if ($my_sidebar_heading_recent !=="") { echo $my_sidebar_heading_recent; } else { echo "Recent Posts";} ?></h4><ul>
    <?php 
    global $post; 
    $current_page_recent = get_post( $current_page );
    $myrecentposts = get_posts(array('post_not_in' => get_option('sticky_posts'), 'cat' => "-$cat,-$catHidden",'showposts' => $my_recent_count));
    foreach($myrecentposts as  $idxrecent=>$post) {
        if($post->ID == $current_page_recent->ID)
            {
                $home_menu_recent = ' class="current_page_item';
            } 
            else 
            {
                $home_menu_recent = ' class="page_item';
            }
            $myclassrecent = ($idxrecent == count($myrecentposts) - 1 ? $home_menu_recent.' last"' : $home_menu_recent.'"'); 
        ?>
    <li<?php echo $myclassrecent ?>><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php 
    } ; if (($myrecentpostscount > $my_recent_count) && $my_recent_count > -1){ ?><li><a href="<?php bloginfo('url'); ?>/site-map">View all</a></li><?php } ?></ul></div>
<?php 
}
} 
global $sitemap;
echo "in category: ".in_category('is-sidebar'); //RETURNS NOTHING

【问题讨论】:

  • 在不知道 in_sidebar 究竟做了什么的情况下无法判断。也许第二个参数是&amp; 引用并被更改?也许该函数会导入块中正在更改的全局变量?
  • is-sidebar 是一个 wordpress 类别。我正在测试是否将当前帖子分配到此类别。

标签: php wordpress


【解决方案1】:

PHP 中的变量区分大小写。这意味着$_POST(一个predefined variable)与$_post不同。

如果你真的是说$_post,这是一个糟糕的变量名,因为它可能会在以后混淆。

【讨论】:

  • 实际上,在没有 $_post 变量的情况下,我得到了相同的输出。我已将其删除以避免混淆,但是是的,它应该是 $_POST。
【解决方案2】:

您的 foreach $myrecentposts 声明了一个新变量 $post。在那里为 $post 使用不同的名称。

【讨论】:

  • 当我更改代码时,我只会一遍又一遍地重复第一个元素,直到循环结束。 foreach($myrecentposts as $idxrecent=>$mypost) { if($mypost->ID == $current_page_recent->ID)
【解决方案3】:

包含当前帖子的特殊变量称为$post,而不是$_post。但由于这是 in_category() 的默认值,因此您无需传递第二个参数。

但是you need to add a call to setup_postdata($post) inside that foreach loop 可以设置帖子数据。没有它,像the_title() 这样的“神奇”函数将继续返回原始帖子的帖子数据。请注意,该变量必须被称为$post

【讨论】:

  • 没有 setup_postdata() 也能正常工作。不知道为什么,但我从来不需要使用它。
  • @Scott,你解决了你在camomileCase的回答中评论的问题吗?我想是因为这个……
  • 不,当我将 foreach($myrecentposts as $idxrecent=>$post) 更改为... foreach($myrecentposts as $idxrecent=>$myrenamedpost){setup_postdata($myrenamedpost);我仍然重复循环中的第一项。顺便说一句,有没有更好的方法来格式化 cmets 中的代码?
  • @Scott,您可以在您的 cmets 中用反引号 (`) 包围您的代码...您的示例确实不起作用,因为传递给 setup_postdata() 的变量必须称为 $post .
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2011-07-25
相关资源
最近更新 更多