URL中的POST-ID与$POST->ID不同

时间:2013-10-20 作者:Hexodus

我有一个页面,左栏有一个blogroll,右栏有一个sidbar。当我尝试检索侧栏中的页面id时,如:

echo $post->ID;
echo get_the_ID();
结果是3726 但是页面URI是page_id=3722 ! 我现在真的很困惑。我必须捕获真实的页面id才能使用自定义字段(使用正确的值)。

编辑:

我刚刚注意到3726是显示的最后一个博客元素的id。但是如何获取页面id呢?

2 个回复
SO网友:fuxia

有两种方法可以满足您的需求。其中一个在Identify the page being shown while in The Loop:

$post_id = get_queried_object_id();
不幸的是,这可能会中断。get_queried_object_id() 查找全局变量$wp_query 对于ID,该变量可以在页面呈现期间通过query_posts(). 对于以下函数也是如此is_page().

但是您可以更早地在template_redirect, 存储它的值,并将其放入您的widget类中。

首先,我们需要一个helper函数来收集帖子ID,以便以后使用:

add_action( \'template_redirect\', \'collect_real_post_id\' );

function collect_real_post_id()
{
    static $post_id = 0;

    if ( is_singular() && \'wp_head\' === current_filter() )
        $post_id = get_queried_object_id();

    return $post_id;
}
现在,您可以在任何地方使用该值,例如widget() 方法:

class My_Widget extends WP_Widget
{

    public function widget( $args, $instance )
    {
        $post_id = collect_real_post_id();

        if ( ! $post_id ) // 0 evaluates to FALSE
            return;

        // do something with the post ID
    }
}

SO网友:Hexodus

实际上,get\\u queryed\\u object\\u id()应该可以做到这一点,但它没有存储正确的页面id,就像toscho提到的那样,它可能会中断。

解决这个问题有一个简单的方法,我总是喜欢最简单的解决方案。所以我选择了这个。

我将永久链接设置切换为“pagename”,现在我的url是这样的:http://www.mypage.com/examplepage/ 现在我可以使用不带斜杠的URI来为该方法提供信息get_page_by_path()生成的代码:

function get_page_real_id_by_uri()
{
    $uri =  $_SERVER[\'REQUEST_URI\'];
    $uri = str_replace("/", "", $uri);
    return get_page_by_path($uri)->ID;
} 
我不确定在Wordpress(我是新手)中是否可以声明两个相同的路径名-这可能是此解决方案的一个弱点。但到目前为止,它工作得很好。

结束

相关推荐

WP_REGISTER_SIDABAR_WIDGET()取消了我的Widges子菜单--我做错了什么?

将他人制作的主题作为官方职责。起初,它会导致wp admin Widgets页面出错—根本不起作用。然后我第一个想到的是调试。。。Debugging steps“raquo;已激活WP_DEBUG.“raquo;停用所有插件“raquo;切换到默认主题“T13”。Errors发现问题来自主题。再次激活主题,它在前端和后端都显示了许多调试通知。首先是:register_sidebar_widget() is deprecated.所以我毫不犹豫地去了wp_register_sidebar_wid