如何使用定制程序设置实现选择性刷新?


10

我正在制作的主题的页面模板中有一个部分,该部分根据用户使用下拉列表控件在定制器中选择的页面显示内容。现在,它仅使用标准的默认刷新传输方式,但是由于那样重装整个iframe很麻烦,我想知道是否有可能使用新的选择性刷新功能。但是我不确定如何实现它。有人知道这是否可行吗?

这是我的页面模板中显示内容的代码:

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

这是定制器中设置的代码:

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

Answers:


10

创建一个函数以输出选择性刷新的模板代码

(我将HTML包装在其中<div class="cta-wrap">,以使其更易于定位此特定标记块。)

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

通过调用上面新创建的函数来更新模板:

wpse247234_cta_block();

设置定制器

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

在刷新项目时样式化

在部分刷新的同时,受影响的元素将customize-partial-refreshing添加有类。您可以这样设置样式:

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

有用的网址


似乎您知道的太多;)因此,如果您认为自己可能有一个答案,那么下一个层次是混合设置,其中某些属性更改会触发部分刷新,而另一些完全刷新(在这种情况下,需要完全设置来设置全局JS选项) 。我应该提出一个正式问题吗?;))
马克·卡普伦

@MarkKaplun,如果您知道这个答案花了我多长时间,则似乎根本不是这样:-)在我的测试设置中,除了上面的选择性刷新之外,我还混合了整页刷新选项。似乎开箱即可正常工作。如果您不介意,我希望提供一个包含您的具体细节的新问题,并且在时间允许的情况下,我很乐意对此进行说明。
Dave Romsey

1
关于fallback_refresh评论:“当文档不包含.cta-wrap选择器时,防止不断刷新”。无限重载的错误应在4.7-RC1中修复。
韦斯顿·鲁特

1
@ dave-romsey JS的目的是customize-preview.js什么?好像是将元素的内容设置为页面ID?选择性刷新不应该为您处理所有这些事情,因此根本不需要此JS文件吗?
Weston Ruter

@WestonRuter感谢您提供有关4.7-RC1中无限刷新的修复说明。您也customize-preview.js认为不必要是正确的(自然是:-p),因此我从答案中删除了它。
Dave Romsey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.