save_post アクションを使用して、カスタム投稿のメタデータ フィールドを検査し、その値に対して何らかのアクションを実行しています。これは私がやっている方法の本質的な根性です:
add_action('save_post', 'my_save_post');
function my_save_post($post_id)
{
// Check if not autosaving, processing correct post type etc.
// ...
// Get the custom field value.
$my_field_value = get_post_meta($post_id, 'my_field', true);
// Do some action
// ...
}
これは、管理ページから投稿を更新するときに正常に機能します。ただし、最初に投稿を作成するときmy_field_value
は、常に空です。フィールドは正しく保存されますが、このアクション トリガーはフィールドやその他のカスタム フィールドの値を表示できないようです。
作成されたこのタイプのすべての投稿に対してアクションを実行したいと思います。CSV インポート プラグインを介して多くの投稿をインポートします。それでも、カスタム フィールドは正しくインポートされ、アクション トリガーはインポートされた行ごとに起動されますが、save_post アクションは依然としてカスタム フィールドの値を認識できません。
ドキュメントからわかる限り、このアクションが実行されるまでに投稿はすでに作成されているため、常にそのカスタム メタフィールドを確認できるはずです。
答えは、物事が起こる順序にあるようです。フォームから投稿を作成すると、適切なアクションによってカスタム フィールドがすべて収集され、save_post アクションが実行される前に投稿に追加されます。これは、トリガーがこれらのカスタム フィールドの値を確認できることを意味します。
CSV からインポートする場合、基本的な投稿が最初に作成され、次にカスタム メタフィールドが追加されます。save_post トリガーは、メタフィールドが追加される前の最初の作成時に発生するため、カスタム フィールド データは save_post アクションには表示されません。
私の解決策は、アクションupdated_post_meta
とadded_post_meta
アクションを使用してメタデータの更新をキャッチすることでしたsave_post
。
add_action('updated_post_meta', 'my_updated_post_meta', 10, 4);
add_action('added_post_meta', 'my_updated_post_meta', 10, 4);
function my_updated_post_meta($meta_id, $post_id, $meta_key, $meta_value)
{
// Make sure we are handling just the meta field we are interested in.
if ($meta_key != 'my_custom_field') return;
if (wp_is_post_revision($post_id)) return;
if (get_post_type($post_id) != 'my_post_type') return;
if (trim($meta_value) == '') return;
// Do my custom task (linking this post to a parent post in a different
// post type). This is the same task performed by the save_post action.
my_link_product_track($post_id, trim($meta_value));
}
それは基本的に私がしていることであり、うまく機能しているようです。上記のすべてをテーマのカスタム クラスにカプセル化し、ここに示すようにグローバル スコープ変数を使用することはお勧めしませんが、これは単にメソッドを示すためのものです。