カスタマイザ設定で選択的リフレッシュを実装するにはどうすればよいですか?


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

回答:


10

選択的に更新されたテンプレートコードを出力する関数を作成する

<div class="cta-wrap">このマークアップの特定のブロックを簡単にターゲティングできるように、HTMLをラップしました。)

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オプションを設定するには完全な設定が必要です) 。正式な質問をする必要がありますか?;))
Mark Kaplun 2016年

@MarkKaplun、この回答にどれほど時間がかかったのかわかっていれば、まったくそのようには見えないでしょう:-)私のテスト設定では、上記の選択的な更新に加えて、ページ全体の更新オプションが混在しています。箱から出してすぐに問題なく動作するようです。よろしければ、具体的な詳細を記載した新しい質問をお勧めします。時間があれば、喜んでお答えします。
Dave Romsey 2016年

1
fallback_refreshコメント:「防止定数リフレッシュ文書が.ctaラップセレクタが含まれていないとき」。無限リロードのバグは4.7-RC1で修正されます。
Weston Ruter、2016年

1
@ dave-romsey JSの意味は何customize-preview.jsですか?要素のコンテンツをページIDに設定しているようですか?代わりに、選択的リフレッシュがこれらすべてを処理するべきではないので、このJSファイルはまったく必要ありません。
Weston Ruter、2016年

@WestonRuterは、4.7-RC1の無限リフレッシュの修正に関するメモをありがとうございます。あなたは(当然:-p)customize-preview.js不要であることについても正しいので、私はそれを答えから削除しました。
Dave Romsey 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.