markItUp pour un widget Wordpress
Question
J'utilise markItUp pour un textarea dans un widget WP (qui est, sur la page widgets.php, lors de la création et l'édition d'un widget).
Le textarea est markItUp'ed quand j'ouvre le widget, mais après avoir cliqué sur Enregistrer la fonctionnalité est perdue et je suis de retour à un textarea régulier.
Je comparais le code source pour l'avant-enregistrer et après enregistrer les versions de la page et il n'y a pas de différence -obviously, que la page n'est pas rechargées. Est-ce que jQuery besoin d'être invoqué pour chaque appel ajax?
J'ai essayé d'ajouter
jQuery(".markitup").markItUp(mySettings);
à l'intérieur de la fonction de gestion des formulaires du widget, mais cela n'a pas aidé. J'ai essayé d'apporter des modifications contraignantes cet événement à qui ne trop bouton d'enregistrement, mais ne semble pas faire une différence (il y a une bonne chance que je l'ai eu tout faux).
La solution
jQuery
Alors, la première chose que vous devez faire est de crochet dans l'appel AJAX afin que vous êtes averti lorsque les widgets ont été enregistrés. Pour ce faire, nous allons utiliser la fonction ajaxSuccess
jQuery. Mettez cela dans son propre fichier js
:
// Use a self executing function so we can safely use
// $ inside and know it = jQuery
(function($){
// Tie into all jQuery AJAX requests
$(document).ajaxSuccess(function(e, x, o){
// Make sure our widget is the one being saved
// id_base will equal whatever is set in the PHP for the widget
// In this example, we target the text widget
if(o.data && o.data.indexOf('id_base=text') > -1){
// Now, lets quickly find all the right elements
// and filter out the ones already set up, and finally
// apply the `markItUp` call, but we will delay just to give
// WP a chance to update the widget
window.setTimeout( function(){
$("textareas.markItUp:not(.markItUpEditor)").markItUp(mySettings);
}, 200 );
}
});
})(jQuery);
Le PHP / WordPress
Enfin, dites-WP d'inclure votre nouveau fichier js uniquement sur la page des widgets. Vous aurez besoin d'intégrer ce soit dans functions.php
ou si vous construisez un widget, dans le fichier PHP widgets:
function register_markitup(){
wp_enqueue_script( 'markitup-widgets', WP_PLUGIN_URL . '/your-plugin/js/markitup-ajax.js' );
}
add_action( "admin_print_scripts-widgets.php", 'register_markitup' );
Modifier J'ai eu un crochet add_action
incorrect quand je posté. Il avait besoin de l'.php
que je viens d'ajouter. Le code est correct maintenant.
Autres conseils
La solution de Doug fonctionnait très bien. Je ne devais changer la fonction window.setTimeout comme suit:
window.setTimeout( function(){
$("textarea.markItUp").each(function () {
if (!($(this).hasClass('markItUpEditor'))) {
$(this).markItUp(mySettings);
}
});
}, 200 );