web-dev-qa-db-ja.com

関数wordpressでadd_action()を呼び出します。

WordPressフックに問題があります。アクションを別のアクションコールバックで呼び出したいのですが、うまくいかないようです。ページが保存されている場合にのみadd_meta_tagアクションを呼び出したいです。これは私が持っているものです:

function saveCustomField($post_id)
{
    add_action( 'wp_head', 'add_meta_tag' );
}
add_action( 'save_post', 'saveCustomField' );

function add_meta_tag(){
    echo "TEST";
}

上記を正しく動作させるにはどうすればよいですか?

1
Skatox Nike

あなたはこれが全く間違っていると考えています。メタタグは、投稿が保存されたときに追加するものではなく、投稿が 閲覧済み のときに出力に追加されるものです。

そのため、アクションをsave_postの内側にフックしようとする代わりに、あなたはそれをページがロードされるたびにフックし、そして inside あなたのカスタムフィールドが表示されている投稿に存在するかチェックします。もしそうなら、あなたはタグを出力します。

function wpse_283352_add_meta_tag() {
    if ( is_singular() {
        $post_id = get_queried_object_id();
        $meta = get_post_meta( $post_id, '_my_custom_field', true );

        if ( $meta ) {
            echo '<meta name="my_custom_field" content="' . esc_attr( $meta ) . '">';
        }
    }
}
add_action( 'wp_head', 'wpse_283352_add_meta_tag' );

その関数は他のフックの中ではなく、単にあなたのプラグインファイル/ functionsファイルの中に入ります。

2
Jacob Peattie

save_postフックは、データがデータベースに保存された後(投稿またはページが作成または更新された場合は常に) - 管理ページでのみ起動されます。

wp_headフックはwp_head()関数が実行されたときに起動し、これは管理者ページでは起こりません。

これはうまくいきません。いつどこでメタタグを追加しますか。

0
Greg36

簡単に言うと、できません。

コードは問題ありませんが、ロジックに問題があります。 wp_headアクションが遅すぎます。ヘッダはすでに送信されているので、wp_headは起動しません。以下のこのコードは、2つの点を証明します。最初:save_postは管理ページとフロントエンドの両方で起動します。第二に:コールバック関数で無限ループを防ぐのは簡単です。

functions.php内:

function saveCustomField($post_id) {

    // to prevent an infinite loop
    remove_action('save_post', 'saveCustomField', 10);

    // to prove that function was called
    error_log('I am here to add action');

    add_action('wp_head', 'add_meta_tag');
}
add_action('save_post', 'saveCustomField');

function add_meta_tag(){
    error_log('TEST');
    //echo "TEST";
}

私のページテンプレート(フロントエンド):

wp_update_post(array('ID' => 79, 'post_title' => 'My Current Test',));

Error_log内:

[19-Oct-2017 02:57:08 UTC] I am here to add action

私の投稿のタイトルは更新され、save_postは解雇され、wp_headはそうではありませんでした。

公開/更新ボタンが押されたときにメタタグを追加したいです。メタページを追加/削除する管理ページにチェックボックスがあります。情報としては、プラグインを対象としています。

function saveCustomField($post_id)
{
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
}

if (
    !isset($_POST['my_custom_nonce']) ||
    !wp_verify_nonce($_POST['my_custom_nonce'], 'my_custom_nonce_'.$post_id)
) {
    return;
}

if (!current_user_can('edit_post', $post_id)) {
    return;
}

if (isset($_POST['_my_custom_field'])) {
    update_post_meta($post_id, '_my_custom_field', $_POST['_my_custom_field']);
    // here
    // >>>>> add_action('wp_head', 'add_meta_tag');
} else {
    delete_post_meta($post_id, '_my_custom_field');
}

}

add_action( 'save_post', 'saveCustomField' );

function add_meta_tag(){
    echo "TEST";
}
0
Skatox Nike