¿Cómo implemento la actualización selectiva con una configuración de personalizador?

10

Tengo una sección en una plantilla de página en el tema que estoy creando que muestra contenido basado en una página que el usuario selecciona en el personalizador usando el control de páginas desplegables. En este momento, solo está utilizando el transporte de actualización predeterminado estándar, pero dado que es un poco pesado recargar todo el iframe, me preguntaba si sería posible usar la nueva función de actualización selectiva. Pero no estoy seguro de cómo implementarlo. Alguien sabe si esto es posible y, de ser así, ¿cómo hacerlo?

Aquí está el código en mi plantilla de página que muestra el contenido:

<?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>';
}
} ?>

Aquí está el código para la configuración en el personalizador:

$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
) );
jetyet47
fuente

Respuestas:

10

Cree una función para generar el código de plantilla actualizado de forma selectiva

(Envolví el HTML <div class="cta-wrap">para que sea más fácil apuntar a este bloque particular de marcado).

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>';
    }
}

Actualice su plantilla con una llamada a la función recién creada anterior:

wpse247234_cta_block();

Configurar el personalizador

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' );

Estilizar el elemento a medida que se actualiza

Mientras que el parcial es refrescante, el elemento afectado tendrá la clase customize-partial-refreshingagregada. Puedes peinarlo así:

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

Enlaces Útiles

Dave Romsey
fuente
parece que sabes demasiado;) así que si crees que podrías tener una respuesta, el siguiente nivel es tener una configuración mixta con algún cambio de atributo que desencadene una actualización parcial mientras que la actualización completa (completa en este caso es necesaria para configurar las opciones globales de JS) . ¿Debo hacer una pregunta formal? ;))
Mark Kaplun
@ MarkKaplun, si supieras cuánto tiempo me llevó esta respuesta, no parecería así en absoluto :-) En mi configuración de prueba, tengo una mezcla de opciones de actualización de página completa además de la actualización selectiva anterior. Parece funcionar bien desde el primer momento. Si no le importa, preferiría una nueva pregunta con sus detalles específicos, y cuando el tiempo lo permita, me complacería analizarlo.
Dave Romsey, el
1
Con respecto al fallback_refreshcomentario: "evita la actualización constante cuando el documento no contiene el selector .cta-wrap". El error con la recarga infinita debe repararse en 4.7-RC1.
Weston Ruter
1
@ dave-romsey ¿Qué sentido tiene el JS customize-preview.js? ¿Parece que está configurando el contenido del elemento a la ID de la página? ¿No debería la actualización selectiva manejar todo esto por usted y, por lo tanto, no hay necesidad de este archivo JS?
Weston Ruter
@WestonRuter gracias por la nota sobre la solución para la actualización infinita en 4.7-RC1. También tienes razón (naturalmente :-p) acerca de que customize-preview.jses innecesario, así que lo eliminé de la respuesta.
Dave Romsey