web-dev-qa-db-fra.com

Y compris javascript pour un shortcode

Je crée un plugin qui permet à un utilisateur d'utiliser un shortcode. Ce shortcode dépend d'un tas de javascript qui doit être présent une fois le shortcode chargé.

Je n'arrive pas à décider quand et où charger le code javascript. Les morceaux de code que le shortcode crache sont des éléments qui doivent être présents, mais ne peuvent pas être utilisés par jQuery.

Existe-t-il un moyen spécifique de charger et d’attacher des scripts sur lequel un shortcode repose?

function build_total_search_method( $atts ) {

    $shorcode_php_function = include( dirname(__FILE__) . "/includes/total_search.php" );

    return $shorcode_php_function;

}
add_shortcode( 'total_search', 'build_total_search_method' );

Cela semble fonctionner, mais cela affiche également un 1 sur la page. Cette méthode est-elle acceptable?

2
dcolumbus

Utilisez wp_enqueue_script dans votre gestionnaire de shortcode, dans WordPress> = 3.3, il sera ajouté à la page dans l’action wp_footer. Transmettez toutes les données nécessaires de PHP à JavaScript via wp_localize_script .

4
Milo

La wp_enqueue_script() include the wp_localize_script() est la bonne solution. Analyser les arguments du shortcode ou mettre toujours le script en file d'attente.

Si vous avez beaucoup de données et que vous les utiliserez dans un objet Json. Quelques astuces, qui devraient aider, s’il s’agit de problèmes ou qui renvoient directement à des solutions via JSON. La fonction wp_localize_script() décode les entités HTML, ce qui est assez important, mais pas toujours la solution parfaite. La fonction utilise json_encode(), ce qui peut poser des problèmes dans les tableaux multidimensionnels en relation avec le décodage d'entités. La solution alternative consiste à envoyer les données sous forme d'objet JSON, comme dans l'exemple ci-dessous.

add_action( 'admin_enqueue_scripts', 'fb_print_scripts' );
function fb_print_scripts() {
    global $current_screen;

    if ( isset( $current_screen -> id ) && ! in_array( $current_screen -> id, array( 'post', 'page' ) ) )
        return;

    if ( is_plugin_active_for_network( plugin_basename( __FILE__ ) ) )
        $options = get_site_option( 'my_options_id' );
    else
        $options = get_option( 'my_options_id' );

    if ( ! $options )
        return;
    ?>
    <script type="text/javascript">
        var my_json_object = <?php echo json_encode( $options ); ?>;
    </script>
    <?php
}
0
bueltge