Como implemento a atualização seletiva com uma configuração do personalizador?

10

Eu tenho uma seção em um modelo de página no tema que estou criando que exibe o conteúdo com base em uma página que o usuário seleciona no personalizador usando o controle de páginas suspensas. No momento, está apenas usando o transporte padrão de atualização padrão, mas, como é meio complicado recarregar todo o iframe, fiquei pensando se era possível usar o novo recurso de atualização seletiva. Mas não sei como implementá-lo. Alguém sabe se isso é possível e, em caso afirmativo, como fazê-lo?

Aqui está o código no meu modelo de página que exibe o conteúdo:

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

Aqui está o código para a configuração no 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
fonte

Respostas:

10

Crie uma função para gerar o código de modelo atualizado seletivamente

(Coloquei o HTML dentro <div class="cta-wrap">para facilitar o direcionamento para esse bloco específico de marcação.)

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

Atualize seu modelo com uma chamada para a função recém-criada acima:

wpse247234_cta_block();

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

Modelando o item como ele está sendo atualizado

Enquanto a parcial estiver atualizando, o elemento afetado terá a classe customize-partial-refreshingadicionada a ela. Você pode estilizar da seguinte maneira:

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

Links úteis

Dave Romsey
fonte
parece que você sabe demais;) portanto, se você acha que pode ter uma resposta, o próximo nível é ter uma configuração mista com alguma alteração de atributo que desencadeie atualização parcial enquanto outras atualização completa (neste caso, é necessário definir opções globais de JS) . Devo fazer uma pergunta formal? ;))
Mark Kaplun
@ MarkKaplun, se você soubesse quanto tempo essa resposta me levou, não pareceria assim :-) Na minha configuração de teste, tenho uma mistura de opções de atualização de página inteira, além da atualização seletiva acima. Parece funcionar bem logo que sai da caixa. Se você não se importa, eu preferiria uma nova pergunta com seus detalhes específicos e, quando o tempo permitir, ficaria feliz em resolver isso.
Dave Romsey
11
Sobre o fallback_refreshcomentário: “impede a atualização constante quando o documento não contém o seletor .cta-wrap”. O erro com recarregamento infinito deve ser corrigido em 4.7-RC1.
precisa
11
@ dave-romsey Qual é o sentido do JS customize-preview.js? Parece que está definindo o conteúdo do elemento para o ID da página? A atualização seletiva não deveria lidar com tudo isso para você e, portanto, não há necessidade desse arquivo JS?
precisa
@WestonRuter, obrigado pela observação sobre a correção da atualização infinita no 4.7-RC1. Você está certo (naturalmente :-p) sobre customize-preview.jsser desnecessário também, então eu o removi da resposta.
Dave Romsey