web-dev-qa-db-fra.com

Pourquoi mon javascript n'est-il pas appelé dans mes crochets sauf wp_head?

Je demande en dernière instance parce que je suis totalement dérouté après ne pas pouvoir invoquer des fonctions javascript personnalisées pendant 2 jours consécutifs. Je suis nouveau dans le développement de plugin Wordpress, car je suis d'origine Java et NodeJS et je ne comprends tout simplement pas pourquoi mon code ne fonctionne pas.

Je souhaite ajouter un script dans la tête html en fonction de l'événement de réussite d'une connexion, d'une déconnexion, et de certains autres éléments. J'ai donc pensé que je pouvais me connecter à la fonction wp_registration, wp_login, etc., enrichir des données pour l'appel et l'envoyer à un javascript personnalisé. Cependant, le javascript personnalisé n'est invoqué que lorsque j'appelle la fonction php dans le hook wp_head ou en faisant add_action ('wp_enqueue_scripts', 'my_function' ); et never dans la fonction hook où j'ai besoin de l'invocation.

À des fins de test, j'ai installé une instance propre de Wordpress et ajouté la fonction suivante à mon plugin:

function my_function() {
    wp_register_script( 'custom-script', plugin_dir_url( __FILE__ ) . 'hook-test.js' );
    wp_enqueue_script('custom-script');

    $testVars = array(
            'test' => __('I should see something!'),
    );

    wp_localize_script('custom-script', 'test_script_vars', $testVars);
}

Maintenant comment puis-je utiliser ceci sous la forme (ou avec une fonctionnalité analogue): add_action('wp_login', 'my_function');?

Le javascript n'est jamais exécuté. Mais quand je fais add_action('wp_head', 'my_function'); et add_action ('wp_enqueue_scripts', 'my_function'); c'est ...

Je suis ouvert à toute explication et conseil. Je ne peux pas imaginer que ce soit si difficile à réaliser ...

1
Vegaaaa

En fin de compte, il ne s'agissait pas de mon code, mais du fait que vous ne pouvez pas faire écho à du javascript personnalisé dans le hook 'wp_login'. Pour résoudre ce problème, j'ai appelé set_transient dans mon hook wp_login, puis en vérifiant le wp_head s'il y a un ensemble transitoire. Dans ce cas, je répète mon script javascript et supprime le transitoire par la suite, comme expliqué dans cette réponse: Exécuter du code javascript après le hook wp_login?

Mon code est maintenant:

/**
 * Register scripts used for pushing in the dataLayer
 */
function add_my_scripts() {
    wp_register_script( 'custom-script', plugin_dir_url( __FILE__ ) . 'js/append_user_status.js' );
}

/**
 * Set transient in wp_login hook function
 */
function wp_login_hook( $user_login ) {
    set_transient( $user_login, '1', 0 );
}

/**
 * Add wp_login_hook as wp_login hook function
 */
add_action( 'wp_login', 'wp_login_hook' );

/**
 * Check if there is a transient set and echo js script in wp_head hook
 */
function echo_javascript_after_wp_login() {
    global $current_user;

    if ( ! is_user_logged_in() )
        return;

    if ( ! get_transient( $current_user->user_login ) )
        return;

    $testVars = array(
            'test' => __('I should see something!'),
    );
    wp_enqueue_script ( 'custom-script' );
    wp_localize_script('custom-script', 'test_script_vars', $testVars);
    delete_transient( $current_user->user_login );
}

/**
 * Add echo_javascript_after_wp_login function as wp_head hook
 */
add_action ('wp_head', 'echo_javascript_after_wp_login', 9 );

S'il n'y a aucun ajout à cela, je le marquerai comme la réponse à la question pour aider éventuellement d'autres débutants dans le développement de plugins wordpress.

1
Vegaaaa

WordPress a divers crochets pour mettre en file d'attente les scripts dans différents domaines.

Pour le frontal, il s'agit de wp_enqueue_scripts , pour le backend, il s'agit de admin_enqueue_scripts , et pour la page de connexion, de login_enqueue_scripts .

Je ne connais pas les membres ultimes, mais s'il utilise wp-login.php, le hook login_enqueue_scripts devrait fonctionner.

Si um_user_registration est appelé ailleurs sur le serveur, vous devriez pouvoir mettre en file d'attente du JavaScript lorsque vous vous connectez à um_user_registration. Il sera simplement ajouté au pied de page.

La même chose avec le hook wp_login. Tant que ce hook est appelé avant wp_footer() dans votre thème, vous devriez pouvoir mettre en file d'attente tous les scripts directement.

1
swissspidy

Ce hook sera obsolète dans Ultimate Member 2.0.

A côté de cela, avez-vous ajouté le hook actuel avec do_action dans le fichier header.php de votre thème? Il est nécessaire que add_action fonctionne.

Je ne suis cependant pas sûr que ce soit la meilleure solution.

Je préférerais enregistrer le script séparément, le "localiser" séparément dans um_user_registration (ou son nouvel équivalent sur 2.0) et le mettre en file de façon conditionnelle en utilisant une fonction de Ultimate Member si disponible ou un résultat de l'enregistrement stocké ad hoc dans usermeta si non disponible.

0
Stefano Tombolini