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


12

$ postは、特定の時間に実行されるフックでのみ使用できるようです。$ post-> IDを使用してデータベースからデータをプルする必要がある「init」フックがあります。

これまでのところ、私の唯一の回避策は、$ postを使用して必要な情報を取得する、the_contentに別のフィルターを追加することでした。残念ながら、それはまた画面に戻り値をエコーし​​、フィルターを最初に呼び出した関数に実際にそれを返すことに失敗します。

以下は、必要なデータを抽出するコードですが、エコーして値を返しません。

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からでも完全に動作します。


1
フィルターフックでinitはなくアクションフックが必要ですglobal $post;。スコープに入れるには早すぎます。多分あなたがあなたが達成しようとしていることを説明すると、より良い助けになるでしょう。
Bainternet 2011

アクションフックの動作はまったく同じです。両方を試しました。私はinitが早すぎることを知っています。必要な結果を達成する方法を理解しようとしています。これは、取得するために$ post-IDを必要とするDBから情報を受信するinitで実行されるフィルターです。
ジョナサン

あなたは本当にこれを初期化する必要がありますか?後でフックしないのはなぜですか?
Rarst、2007

URLに何も指定されていない場合は、ページのデフォルトのキーワードを取得する必要があります。そのキーワードはDBに格納され、スクリプトの残りの部分が実行される前に認識されている必要があります。私が提供したサンプルでわかるように、私はthe_contentで必要な値のみを取得できますが、画面にエコーし、呼び出し元の関数にはまったく戻りません。別の解決策がある場合は、それを提案してください。
ジョナサン

ソリューションを回答に移してください。サイトのメカニズムにより近いものになります。また、解決済みのタイトルを付ける必要はありません。回答を受け入れることができ、質問には回答済みのマークが付けられます。
Rarst、2011

回答:


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 );
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.