web-dev-qa-db-de.com

Wie man get_theme_mod zum Laufen bringt AJAX in der Vorschau des Customizers

Ist es möglich, get_theme_mod nach der Aktualisierung im Vorschaufenster des Customizers zum Funktionieren zu bringen, wenn es von AJAX in einem Template-Teil aufgerufen wird?

Ich habe ein Thema, das die Beiträge auf Bildlauf lädt (unendlicher Bildlauf) und alles funktioniert, außer es gibt nicht die aktualisierten Thema-Mods in der Vorschau des Customizers aus. Es gibt die neuen Theme-Mods nur aus, wenn ich den Save-Button drücke.

Haben Sie eine Idee, wie Sie das Update auch nach einer Aktualisierung durchführen können?

Meine Steuerungseinstellungen:


'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

In WordPress 4.8.2 gibt es einen Fehler, der dazu führt, dass ausstehende customized-Änderungen nicht in Ajax-Anforderungen in der Vorschau eingefügt werden. Dies wurde in 4.9-alpha über # 42162 behoben. In der Zwischenzeit können Sie jedoch eine Problemumgehung durchführen, um die angeforderte url mit der folgenden Logik zu ändern:

// 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