Come posso implementare l'aggiornamento selettivo con un'impostazione di personalizzazione?


10

Ho una sezione in un modello di pagina nel tema che sto creando che mostra il contenuto in base a una pagina che l'utente seleziona nel personalizzatore usando il controllo delle pagine a discesa. In questo momento sta solo usando il trasporto di aggiornamento predefinito standard, ma dato che è un po 'goffo ricaricare l'intero iframe, mi chiedevo se fosse possibile utilizzare la nuova funzionalità di aggiornamento selettivo. Ma non sono sicuro di come implementarlo. Qualcuno sa se questo è possibile e se sì, come si fa?

Ecco il codice nel mio modello di pagina che mostra il contenuto:

<?php if ((get_theme_mod( 'intro_page' )) != '') {

$intro_id = get_theme_mod( 'intro_page' );

$intro_header = get_the_title( $intro_id );

$intro_excerpt = get_the_excerpt( $intro_id );

$intro_link = get_the_permalink( $intro_id );

$intro_linktext = get_post_meta( $intro_id, 'emm_cta_text', true );

echo '<h1>' . esc_html($intro_header) . '</h1>' . '<p>' . esc_html($intro_excerpt) . '</p>';

if( ! get_post_meta( $intro_id, 'emm_cta_text', true ) ) {
echo '<p><a class="cta" href="' . esc_url($intro_link) . '">Learn More</a></p>';
}else{
echo '<p><a class="cta" href="' . esc_url($intro_link) . '">' . esc_html($intro_linktext) . '</a></p>';
}
} ?>

Ecco il codice per l'impostazione nel personalizzatore:

$wp_customize->add_setting( 'intro_page' , array(
'sanitize_callback' => 'absint',
) );

$wp_customize->add_control( 'intro_page', array(
'label'    => __( 'Page to use for intro section', 'veritas' ), 
'section'  => 'intro',
'settings' => 'intro_page',
'type'     => 'dropdown-pages',
'priority' => 1
) );

Risposte:


10

Creare una funzione per generare il codice modello aggiornato in modo selettivo

(Ho racchiuso il codice HTML all'interno <div class="cta-wrap">per rendere più semplice il targeting di questo particolare blocco di markup.)

function wpse247234_cta_block() {
    if ( ( get_theme_mod( 'intro_page' ) ) != '' ) {
        $intro_id       = get_theme_mod( 'intro_page' );
        $intro_header   = get_the_title( $intro_id );
        $intro_excerpt  = get_the_excerpt( $intro_id );
        $intro_link     = get_the_permalink( $intro_id );
        $intro_linktext = get_post_meta( $intro_id, 'emm_cta_text', true );

        echo '<div class="cta-wrap">';
            echo '<h1>' . esc_html( $intro_header ) . '</h1>' . '<p>' . esc_html( $intro_excerpt ) . '</p>';

            if ( ! get_post_meta( $intro_id, 'emm_cta_text', true ) ) {
                echo '<p><a class="cta" href="' . esc_url( $intro_link ) . '">Learn More</a></p>';
            } else {
                echo '<p><a class="cta" href="' . esc_url( $intro_link ) . '">' . esc_html( $intro_linktext ) . '</a></p>';
            }
        echo '</div>';
    }
}

Aggiorna il tuo modello con una chiamata alla funzione appena creata sopra:

wpse247234_cta_block();

Imposta il personalizzatore

function wpse247234_customize_register( $wp_customize ) {

    $wp_customize->add_section( 'intro', array (
            'title'    => __( 'intro', 'text-domain' ),
            'priority' => 999,
    ) );

    $wp_customize->add_setting( 'intro_page' , array(
            'sanitize_callback' => 'absint',
            'transport' => 'postMessage'
    ) );

    $wp_customize->add_control( 'intro_page', array(
            'label'    => __( 'Page to use for intro section', 'text-domain' ), 
            'section'  => 'intro',
            'settings' => 'intro_page',
            'type'     => 'dropdown-pages',
            'priority' => 1
    ) );

    $wp_customize->selective_refresh->add_partial( 'intro_page', array(
        'selector'            => '.cta-wrap',
        'container_inclusive' => true,
        'render_callback'     => 'wpse247234_cta_block',
        'fallback_refresh'    => false, // Prevents refresh loop when document does not contain .cta-wrap selector. This should be fixed in WP 4.7.
    ) );
}
add_action( 'customize_register', 'wpse247234_customize_register' );

Styling dell'elemento mentre viene aggiornato

Durante l'aggiornamento del parziale, all'elemento interessato verrà customize-partial-refreshingaggiunta la classe . Puoi modellarlo in questo modo:

.cta-wrap.customize-partial-refreshing {
    // styles...
}

Collegamenti utili


sembra che tu sappia troppo;) quindi, se pensi di poter avere una risposta, il livello successivo è avere impostazioni miste con alcune modifiche agli attributi che innescano l'aggiornamento parziale mentre altri sono completi (in questo caso è necessario impostare le opzioni JS globali) . Devo fare una domanda formale? ;))
Mark Kaplun,

@MarkKaplun, se tu sapessi quanto tempo impiegava questa risposta non mi sembrerebbe affatto così :-) Nella mia configurazione di test, ho una combinazione di opzioni di aggiornamento della pagina intera oltre all'aggiornamento selettivo sopra. Sembra funzionare bene fin da subito. Se non ti dispiace, preferirei una nuova domanda con i tuoi dettagli specifici e, quando il tempo lo consente, sarei felice di fare una pausa.
Dave Romsey,

1
Per quanto riguarda il fallback_refreshcommento: "impedisce l'aggiornamento costante quando il documento non contiene il selettore .cta-wrap". Il bug con ricarica infinita dovrebbe essere corretto in 4.7-RC1.
Weston Ruter,

1
@ dave-romsey Qual è il punto della JS customize-preview.js? Sembra che stia impostando il contenuto dell'elemento sull'ID della pagina? Invece, l'aggiornamento selettivo non dovrebbe gestire tutto questo per te e quindi non è necessario questo file JS?
Weston Ruter,

@WestonRuter grazie per la nota sulla correzione per l'aggiornamento infinito in 4.7-RC1. Hai ragione (naturalmente :-p) anche customize-preview.jssull'essere superfluo, quindi l'ho rimosso dalla risposta.
Dave Romsey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.