Est-ce la bonne façon de transmettre des données de personnaliser-controls.js à personnaliser-preview.js?
( function( api ) {
api.controlConstructor['typography'] = api.Control.extend( {
ready: function() {
var control = this;
function addGoogleFont(fontName) {
var font = control.params.ogf_fonts[fontName];
var weights = $.map(font.variants, function(value, key) {
return key;
});
var weightsURL = weights.join(',');
var fontURL = font.family.replace(' ','+') + ':' + weightsURL;
wp.customize.previewer.send( 'olympusFontURL', "<link href='https://fonts.googleapis.com/css?family=" + fontURL + "' rel='stylesheet' type='text/css'>" );
}
control.container.on( 'change', '.typography-font-family select',
function() {
var value = jQuery( this ).val();
control.settings['family'].set( value );
if( value != 'default' ) {
addGoogleFont( value );
var font = control.params.ogf_fonts[value];
var weightsSelect = jQuery( '.typography-font-weight select' );
var newWeights = font.variants;
weightsSelect.empty();
$.each( newWeights, function( key, val ) {
weightsSelect.append( $( "<option></option>" )
.attr( "value", key ).text( val ) );
});
}
}
);
}
} );
} )( wp.customize );
Est-ce également mieux que d'essayer de .append()
à l'aperçu iframe directement dans personnaliser-controls.js?
Voici personnaliser-preview.js pour toute personne intéressée:
jQuery( document ).ready( function() {
wp.customize.bind( 'preview-ready', function() {
wp.customize.preview.bind( 'olympusFontURL', function( url ) {
console.log(url);
$("head").append(url);
} );
} );
} ); // jQuery( document ).ready
Vous trouverez ci-dessous des extraits indiquant l’ordre des opérations requis pour que les poignées de transfert de message fonctionnent. Dans votre exemple de code, le contrôle envoie le message sur change
. Il est donc probable que cela ne se produira pas avant l'événement ready
dans son ensemble et cela devrait être correct.
/* Pane, enqueue w/ customize-controls dependency at customize_controls_enqueue_scripts */
wp.customize.bind( 'ready', function() {
wp.customize.previewer.bind( 'ready', function() {
wp.customize.previewer.send( 'greeting', 'Howdy, Preview!' );
} );
} );
/* Preview, enqueue /w customize-preview dependency at wp_enqueue_scripts if is_customize_preview() */
wp.customize.bind( 'preview-ready', function() {
wp.customize.preview.bind( 'greeting', function( message ) {
console.info( Pane sent message:', message );
} );
} );
/* Preview, enqueue /w customize-preview dependency at wp_enqueue_scripts if is_customize_preview() */
wp.customize.bind( 'preview-ready', function() {
wp.customize.preview.bind( 'active', function() {
wp.customize.preview.send( 'greeting', 'Howdy, Pane!' );
} );
} );
/* Pane, enqueue w/ customize-controls dependency at customize_controls_enqueue_scripts */
wp.customize.bind( 'ready', function() {
wp.customize.previewer.bind( 'greeting', function( message ) {
console.info( 'Preview sent greeting:', message );
} );
} );
Au lieu d'ajouter un écouteur d'événement change
pour l'élément select
via jQuery, l'élément select
devrait plutôt être lié à un paramètre que vous écoutez à la place. Donc, votre méthode ready
devrait vraiment ressembler davantage à ceci:
this.setting.bind( function( newFont ) {
if ( 'default' !== newFont ) {
addGoogleFont( newFont );
}
} );
Mais cette addGoogleFont
transmet l'intégralité de la balise link
à l'aperçu, en plus du changement de paramètre envoyé. Ne vaudrait-il pas mieux déplacer toute la logique addGoogleFont
dans l'aperçu proprement dit? Par exemple:
wp.customize( fontSettingId, function( setting ) {
setting.bind( function( newFont ) {
if ( 'default' !== newFont ) {
addGoogleFont( newFont );
}
} );
} )
Vous ne devez donc écouter que les modifications apportées aux paramètres de police dans l'aperçu, puis créer la balise link
à mettre à jour dans l'aperçu.