web-dev-qa-db-fra.com

Wp_localize_script peut-il être utilisé dans un shortcode?

Je développe un plug-in et j'aimerais rendre les données disponibles pour le code JS côté client exécuté par l'un de mes shortcodes. wp_localize_script semble être le moyen évident de le faire, mais cela ne fonctionne pas pour moi: mon script est inclus, mais pas les données JS. Les données dépendent d'une valeur dans la chaîne de requête, lue par le shortcode. Je soupçonne quelque chose à voir avec le timing relatif des scripts et des codes courts dans le cycle de vie WP. J'ai un code JS non utilisé dans un shortcode qui est heureusement fourni avec des données en utilisant wp_localize_script.

Fichier plugin abrégé:

function shortcode_orderitem() {

    $id = intval($_GET['id']);
    $productData = retrieveSingleProductData($id);
    wp_localize_script('orderitem', 'productData', $productData); //THIS DOES NOT WORK
    return orderItem_buildHTML($productData);
}

function enqueue_general_scripts()
{
    wp_enqueue_script('orderitem', plugin_dir_url(__FILE__) . 'client/orderitem.js', ['jquery']);

    wp_enqueue_script('mainbag', plugin_dir_url(__FILE__) . 'client/mainbag.js', ['jquery']);
    $url = admin_url( 'admin-ajax.php' );
    wp_localize_script('mainbag', 'bagParams', ['url' => $url]); //THIS WORKS
}

add_shortcode('orderitem', "shortcode_orderitem");

add_action( 'wp_enqueue_scripts', 'enqueue_general_scripts' );

Y a-t-il une raison fondamentale pour laquelle vous ne pouvez pas utiliser wp_localize_script directement dans un shortcode comme celui-ci? Est-ce que je manque quelque chose d'autre? Y a-t-il un moyen de le contourner? Merci d'avance!

1
frumious

Les paramètres par défaut pour wp_enqueue_script génèreront le script dans la fonction wp_head. Les codes courts s'exécutent généralement plus tard, lors de la sortie du contenu principal.

Dans ce cas, appeler wp_localize_script dans le gestionnaire Shortcode n'aura aucun effet, car le script a déjà été généré.

Définir le paramètre $in_footer sur true lors de la mise en file d'attente du script retardera la sortie du script jusqu'à wp_footer, de sorte que wp_localize_script réussira dans ce cas.

2
Milo