在初始化过滤器或操作中获取$ post?


12

似乎$ post仅可用于在特定时间执行的钩子。我有一个“ init”钩子,需要使用$ post-> ID从数据库中提取一些数据。

到目前为止,我唯一的解决方法是在the_content上添加另一个过滤器,该过滤器使用$ post获取我需要的信息。不幸的是,它也将返回值回显到屏幕上,而无法将其实际返回给最初调用过滤器的函数。

这是提取所需数据的代码,但是回显并无法返回值:

add_filter('the_content', 'get_keyword');
function get_keyword()
{
    global $post;
    $keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
    return $keyword;
}

有没有人对如何获得我所需的任何建议,并将其传递回调用函数以供以后在插件中使用?

编辑:为了更清楚一点,我在init上运行了一个筛选器,该筛选器需要能够从数据库中检索有关当前帖子的信息。为此,它需要访问$ post-> ID。但这在init中是不可能的,那么如何获得所需的结果?

谢谢,

乔纳森

解决了:

原来答案只是使用url_to_postid像这样:

$keyword = get_post_meta(
     url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
     '_wpg_def_keyword',
     true
);

即使从init完美工作。


1
您需要一个动作钩子而不是过滤器钩子,这还init为时过早global $post;。也许如果您描述您要完成的工作会有所帮助。
Bainternet

动作钩子的行为完全相同,我都尝试过。我知道初始化还为时过早,我试图弄清楚如何实现所需的结果-这是一个在初始化时运行的过滤器,该过滤器从DB接收需要$ post-ID检索的信息。
乔纳森

您真的需要在init上执行此操作吗?为什么以后不钩?
罗斯特(Rarst)2011年

如果URL中没有提供默认关键字,则必须检索该页面的默认关键字。该关键字存储在数据库中,并且在执行脚本的其余任何部分之前必须先知道该关键字。如您在我提供的示例中所看到的,我只能在the_content中获取所需的值,但随后它会回显到屏幕,并且根本不会传递回调用函数。如果您还有其他解决方案,请提出建议。
乔纳森

请将您的解决方案转移到答案上,这将更符合站点的机制。同样,您也无需在标题中加上已解决的标题-您将能够接受答案,并且您的问题会被标记为已回答。
罗斯特2011年

Answers:


12

原来答案只是这样使用url_to_postid

$keyword = get_post_meta( url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ), '_wpg_def_keyword', true );

即使在,也能完美工作init


2

这也适用于WordPress 4.7:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

2

使用接受的答案时出现问题,因为它不适用于端口和多站点端口。这是一个在每种情况下都适用的解决方案:

/**
* Note: This function will only work on SINGULAR posts/pages/post types
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demo
add_action('init','my_super_early_meta_action');

function my_super_early_meta_action() {
    $keyword = get_post_meta( get_early_postid(), '_wpg_def_keyword', true );
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.