web-dev-qa-db-fra.com

Appelez add_action () dans la fonction wordpress

J'ai un problème avec un hook WordPress. Je veux appeler une action dans un autre rappel d'actions, mais cela ne semble pas fonctionner. Je souhaite appeler l'action add_meta_tag uniquement si la page est enregistrée. C'est ce que j'ai

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

function add_meta_tag(){
    echo "TEST";
}

Comment puis-je obtenir ce qui précède pour fonctionner correctement?

1
Skatox Nike

Vous pensez à cela totalement faux. Une méta-tag n'est pas quelque chose que vous ajoutez quand un article est enregistré, mais quelque chose qui est ajouté à la sortie quand un article est visualisé .

Ainsi, au lieu d'essayer d'accrocher l'action dans save_post, vous l'accrochez à chaque chargement de page et à l'intérieur le crochet que vous vérifiez si votre champ personnalisé existe dans la publication en cours de visualisation. Si c'est le cas, vous exportez la balise.

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' );

Cette fonction va simplement dans votre fichier de plugin/fichier de fonctions, pas dans un autre crochet.

2
Jacob Peattie

Le hook save_post est déclenché une fois les données enregistrées dans la base de données - chaque fois que la publication ou la page est créée ou mise à jour - uniquement sur les pages d'administration.

Le hook wp_head se déclenche lorsque la fonction wp_head() est exécutée et cela ne se produit pas sur les pages d'administration.

Cela ne marchera pas. Où et quand voulez-vous ajouter la balise META?

0
Greg36

La réponse courte: vous ne pouvez pas.

Le code est correct, mais il y a une faille dans la logique. wp_head l'action est définie trop tard. Les en-têtes sont déjà envoyés, donc wp_head ne sera jamais déclenché! Ce code ci-dessous prouvera deux points. D'abord: save_post se déclenchera aussi bien sur les pages d'administration que sur les serveurs frontaux. Deuxièmement: il est facile d’empêcher une boucle infinie dans la fonction de rappel.

Dans 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";
}

Dans mon modèle de page (front end):

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

En error_log:

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

Le titre de mon message avait été mis à jour, save_post a été congédié et wp_head ne l'était pas.

0

Je veux ajouter la balise META lorsque le bouton Publier/Mettre à jour est activé. J'ai une case à cocher sur la page d'administration qui ajoute/supprime une balise méta. Pour info, il est destiné à un plugin.

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