Древесина get_theme_mod в шаблоне

Я очень новичок в Timber. Я хочу переделать (воспроизвести) одну из моих тем WordPress с помощью Timber. Я пытаюсь вызвать theme_mod в своем шаблоне, но ничего не появляется.

Любой ответ или совет приветствуются.

Мой оригинальный wp header.php

 //***********************************Phone******************************************************//
            $idbbase_very_top_header_phone      = get_theme_mod( 'idbbase_very_top_header_phone', esc_html__( '(+9) 0999.500.400', 'idweb' ) );
            $idbbase_very_top_header_phone      = apply_filters( 'idbbase_translate_single_string', $idbbase_very_top_header_phone, 'Very Top Header' );
            $idbbase_very_top_header_phone_text = get_theme_mod( 'idbbase_very_top_header_phone_text', esc_html__( 'Call us: ', 'idweb' ) );
            $idbbase_very_top_header_phone_text = apply_filters( 'idbbase_translate_single_string', $idbbase_very_top_header_phone_text, 'Very Top Header' );
            if ( ! empty( $idbbase_very_top_header_phone ) || ! empty( $idbbase_very_top_header_phone_text ) ) {
                echo '<div class='.$class.'><a href="#"><i class="fa fa-phone"></i></a>';
                echo '<span><strong class="idbbase_very_top_header_phone_text">';
                echo $idbbase_very_top_header_phone_text.'</strong>';
                echo '<p class="idbbase_very_top">' .wp_kses( $idbbase_very_top_header_phone, 'post', $allowed_protocols ) . '</p></span>';
                echo '</div>';
            } elseif ( isset( $wp_customize ) ) {
                echo '<div id="idbbase_very_top_header_phone" class="idbbase_only_customizer '.$class.'"><span><strong>'.$idbbase_very_top_header_phone_text.'</strong><p class="idbbase_very_top_header_phone_text">' .wp_kses( $idbbase_very_top_header_phone, 'post', $allowed_protocols ) . '</p></span></div>';
            }

Моя древесина header.php

//*************Phone******************************************************//
$idagency_very_top_header_phone      = get_theme_mod( 
'idagency_very_top_header_phone', esc_html__( '(+9) 0999.500.400', 'idweb' ) 
);
$idagency_very_top_header_phone2      = apply_filters( 
'idagency_translate_single_string', $idagency_very_top_header_phone, 'Very 
Top Header' );
$idagency_very_top_header_phone_text = get_theme_mod( 
'idagency_very_top_header_phone_text', esc_html__( 'Call us: ', 'idweb' ) );
$idagency_very_top_header_phone_text2 = apply_filters( 
'idagency_translate_single_string', $idagency_very_top_header_phone_text, 
'Very Top Header' );

$context['idagency_very_top_header_phone']      =         
$idagency_very_top_header_phone;
$context['idagency_very_top_header_phone']      = 
$idagency_very_top_header_phone2;
$context['idagency_very_top_header_phone_text'] = 
$idagency_very_top_header_phone_text;
$context['idagency_very_top_header_phone_text'] = 
$idagency_very_top_header_phone_text2;

$GLOBALS['timberContext'] = Timber::get_context();
ob_start();
Timber::render( 'base.twig', $context );

Моя base.twig

 {% if idbbase_very_top_header_phone %}
     <div class="col-md-3">
        <a href="#">
            <i class="fa fa-phone"></i>
        </a>
        <span>
           <strong>{{ idbbase_very_top_header_phone_text }}</strong>
           <p>{{ idbbase_very_top_header_phone }}</p>
       </span>
     </div>
  {% endif %}

person Allhambra    schedule 19.03.2019    source источник


Ответы (1)


Философия Timber отделения данных от разметки требует значительного концептуального сдвига по сравнению со стандартной архитектурой шаблонов Wordpress.

Корень вашей проблемы в том, что вы обрабатываете свой заголовок как шаблон, хотя на самом деле он является частичным.

В терминах Timber шаблон соответствует сообщению или архиву и состоит из двух файлов:
Twig-файл с вашей html-разметкой, смешанной с некоторыми переменными и логикой, и PHP-файл, который, как минимум, определяет следующее:

  1. Контекст Timber для данного поста, созданный с помощью Timber::context() (ранее get_context(), который устарел)
  2. Какой файл (или файлы) twig следует использовать для рендеринга шаблона

Самый простой файл шаблона Timber PHP может выглядеть так:

<?php
/*
 *  This is the `single.php` template
 */
$context = Timber::context();

Timber::render( 'single.twig', $context );

Это сгенерирует визуализированное содержимое single.twig вместе с некоторыми значениями глобального контекста. Чтобы передать реальные значения в шаблон, вы должны назначить их $context, как вы пытались сделать с $context['idagency_very_top_header_phone'] и т. Д. Однако эти значения не могут быть присвоены на уровне частичного - они должны быть назначены в шаблоне. уровень или выше.

Чтобы сделать то, что вы пытаетесь сделать, вам нужно будет настроить шаблон (например, single.php и single.twig), а затем включить файл header.twig в файл шаблона Twig, используя {% include 'header.twig' %}.

Затем вам нужно определить значения контекста, чтобы они были доступны single.twig и всем его включенным частям, которые в данном случае будут включать header.twig. Вы можете определить их непосредственно в файле single.php после определения $context. Для простоты я определяю только одно из ваших значений:

/* single.php */

$context = Timber::context();

$idagency_very_top_header_phone = get_theme_mod(
    'idagency_very_top_header_phone',
    esc_html__( '(+9) 0999.500.400', 'idweb')
);

$context['idagency_very_top_header_phone'] = $idagency_very_top_header_phone;

Timber::render( 'single.twig', $context );

Если вам нужно, чтобы эти значения были глобальными для всех шаблонов, вы также можете определить их в functions.php вашей темы, используя (плохо документированный) фильтр timber/context. Тогда значения будут доступны в любом шаблоне, где используется этот Timber::context():

/* This would be placed in your functions.php file
 * (or a separate file that's been included in functions.php)
 */
add_filter( 'timber/context', function( $context ) {
    $idagency_very_top_header_phone = get_theme_mod(
        'idagency_very_top_header_phone',
        esc_html__( '(+9) 0999.500.400', 'idweb')
    );

    $context['idagency_very_top_header_phone'] = $idagency_very_top_header_phone;

    return $context;
} );

При этом не учитываются некоторые ключевые шаги по настройке полного шаблона, такие как включение данных из фактического сообщения, но все это прилично задокументировано в Руководство Timber по началу работы.

Ключевыми точками TL; DR являются:

  1. Контекст Timber определяется один раз для каждого сообщения.
  2. Контекст и все его значения передаются напрямую из шаблона PHP сообщения в его шаблон Twig.
  3. Частичные файлы Twig не привязаны напрямую к частичным файлам PHP.
  4. Части, включенные в шаблон Twig, наследуют контекст Timber из этого шаблона. То же самое и с частичными элементами, вложенными в эти частичные элементы.
person Jesse    schedule 28.03.2019