it-swarm-ja.com

initフィルタまたはアクションで$ postを取得しますか?

$ postは特定の時間に実行されているフックにしか利用できないようです。私は$ post-> IDを使ってデータベースからデータを取得する必要がある "init"フックを持っています。

これまでのところ私の唯一の回避策は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で実行されているフィルタを持っています、それはDBから現在の投稿に関する情報を検索することができる必要があります。これを行うには、$ 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からでも完全に動作します。

9
Jonathan

答えは単純に url_to_postid を次のように使用することでした。

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

initからでも完全に動作します。

11

これはWordPress 4.7でも動作します。

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

受け入れられた答えを として使用して問題が発生した場合、ポートおよびマルチサイトポートでは機能しません 。これはあらゆる場合にうまくいくはずの解決策です:

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