在初始化筛选器或操作中获取$POST?

时间:2011-07-13 作者:Jonathan

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

到目前为止,我唯一的解决方法是在\\u内容上添加另一个过滤器,它使用$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上运行了一个过滤器,它需要能够从DB中检索当前帖子的信息。要做到这一点,它需要访问$post->ID。但这在init中是不可能的,所以我如何才能获得所需的结果?

谢谢

乔纳森

SOLVED:

事实证明,答案很简单,就是使用url\\u to\\u postid,如下所示:

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

Works perfectly even from init.

3 个回复
SO网友:JVC

结果证明答案很简单url_to_postid 像这样:

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

SO网友:rogie

这也适用于WordPress 4.7:

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

SO网友:Blackbam

使用接受的答案时出现问题,因为它不适用于端口和多站点端口。以下是一个在任何情况下都应该有效的解决方案:

/**
* 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 );
}

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴