web-dev-qa-db-fra.com

Comment faire fonctionner get_theme_mod avec AJAX dans l'aperçu du personnalisateur

Est-il possible de faire fonctionner get_theme_mod après l'actualisation dans le volet d'aperçu du personnalisateur lorsqu'il est appelé dans une partie de modèle par AJAX?

J'ai un thème qui charge les messages sur le défilement (défilement infini) et tout fonctionne sauf qu'il ne génère pas les mods de thème mis à jour dans l'aperçu du personnalisateur. Il ne sort que les nouveaux mods de thème lorsque je clique sur le bouton de sauvegarde.

Avez-vous une idée de la mise à jour après une actualisation?

Mes paramètres de contrôle:


'id'        => 'show_caption',
'type'      => 'select',
'section'   => 'caption',
'transport' => 'refresh',
'default'   => 'top',
'choices'   => array(
  'top'    => __( 'Top', 'my-domain' ),
  'bottom' => __( 'Bottom', 'my-domain' ),
),

InfiniteScroll.php:


class InfiniteScroll {

  private $query;

  public function __construct( WP_Query $query ) {
    $this->query = $query;
  }

  public function register() {
    add_action( 'wp_ajax_my_infinite_scroll', array( $this, 'handleAjax' ) );
    add_action( 'wp_ajax_nopriv_my_infinite_scroll', array( $this, 'handleAjax' ) );
    add_action( 'wp_enqueue_scripts', array( $this, 'enqueueScripts' ) );
  }

  public function getPosts() {
    ob_start();

    $this->query->query( $this->getData() );

    if ( $this->query->have_posts() ) {
      while ( $this->query->have_posts() ) {
        $this->query->the_post();
        get_template_part( 'template-parts/post/content' );
      }
    }

    wp_reset_postdata();

    return ob_get_clean();
  }

  public function handleAjax() {
    if ( ! check_ajax_referer( 'infinite-scroll-ajax', 'nonce' ) ) {
      wp_die();
    }

    wp_send_json_success( $this->getPosts() );

    wp_die();
  }

  // ...

}

content.php:


echo get_theme_mod( 'show_caption', 'top' );

Ajax request before customize_save:

Before

1
michael

Il y a un bogue dans WordPress 4.8.2 qui empêche les modifications customized en attente d'être injectées dans les demandes Ajax dans l'aperçu. Ce problème a été corrigé dans la version 4.9-alpha via # 42162 . Dans l’intervalle, vous pouvez toutefois effectuer une solution de contournement pour modifier la url demandée avec une logique telle que:

// Workaround defect introduced in WordPress 4.8.2 where preview nonce is not included in request.
if ( 'undefined' !== typeof _wpCustomizeSettings ) {
    urlParser = document.createElement( 'a' );
    urlParser.href = url;
    urlParser.search += '&customize_preview_nonce=' + _wpCustomizeSettings.nonce.preview;
    url = urlParser.href;
}
4
Weston Ruter