私は、publish_post
フックを使用して、発行したばかりの投稿の投稿メタが必要な場所でコードを実行しています。しかし、私が探しているpost metaの値は、この時点ではどういうわけか利用できません。 wp_postmeta
テーブルをチェックしたところ、私はメタキーの値がまだ作成されていないことを発見しました。また、私はこれが初めて公開された投稿に対しても機能することを望みます。他にアクセスできるフックはありますか。
function Push_notification($post_id)
{
$ref_ids = get_post_meta($post_id,'ref_id');
if($ref_ids)
{
//my code goes here
}
}
add_action('publish_post','Push_notification');
それを解決しました!私の投稿メタデータを保存する関数Push_notification()
を実行するのと同様にsave_post_meta()
を実行するためにsave_post
を使いました。メタが保存されていなかったためにアクセス不能のままだったため、問題はcoz Push_notification()
がsave_post_meta()
より前に発生しました。以下のように機能するように関数の優先順位を変更しました。
function Push_notification($post_id)
{
$ref_ids = get_post_meta($post_id,'ref_id');
if($ref_ids)
{
//my code goes here
}
}
add_action('save_post','Push_notification',11,1);
function save_post_meta($post_id,$post)
{
//check for nonces and current user capabilities
$ref_id = sanitize_html_class($_POST['ref_id']);
update_post_meta($post_id,'ref_id',$ref_id);
}
add_action('save_post','save_post_meta',10,2);
function no_notification()
{
remove_action('save_post','Push_notification',11,1);
}
add_action('publish_to_publish','no_notification');
最後の関数no_notification()
は、投稿が最初に作成されたときにのみPush_notification()
が起動され、更新のためではないことを確認します。
あなたは new postsのみに関心があるように見え(遷移が実行されるときに以前に作成された投稿はpostmetaが添付されて利用可能になるので)、特定のpostmeta値が存在する場合にのみ新しく作成された投稿に対してPush_notificationを行いたい。正しい?
すべてのupdate_postmeta呼び出しの後に、do_action()を使用して、postmetaを保存する関数に独自のフックを作成します。 postmetaはその時点で保存されているでしょう、そしてあなたはテストすることができます。
また、get_post_meta()
内でadd_action('publish_post',..)
を呼び出すと、ポストメタが返されないことにも気付きました。
これは、投稿を公開したときに「publish_post」が呼び出されると、 投稿メタはまだデータベースに保存されていないためです 。 update_post_meta()
(投稿メタをデータベースに保存する関数)は、 'publish_post'の後に呼び出されます。そのため、最初にドラフトとして保存してから公開すると機能します。
その問題を避けるために、私はこの種のコードを使います。
$post_meta_value = get_post_meta($post_id,'meta_key',true);
if($post_meta_value==''){ $post_meta_value = $_POST['meta_key']; }
あなたがPublishボタンをクリックすると、これは$ _POSTからあなたの値を取得します。$_POST['meta_key']
は、バックエンドでの投稿メタフィールドまたはカスタムフィールドの設定方法によって異なります。私はACF(Advanced Custom Fields)プラグインを使用していますが、それは$_POST['fields']['field_52fae7b2b4033']
になります。
それが役立つことを願っています。