模板

时间:2019-03-19 14:33:56

标签: twig wordpress-theming timber

我是Timber的初学者。 我想用Timber重做(重现)我的wordpress主题之一。 我尝试在模板中调用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 %}

1 个答案:

答案 0 :(得分:1)

与标准的Wordpress模板体系结构相比,Timber的将数据与标记分离的理念需要重大的概念转变。

问题的根源是,当标头实际上是 partial 时,您将标头视为 template

用Timber术语来说,模板对应于帖子或档案,由两个文件组成:
一个带有HTML标记和一些变量和逻辑的Twig文件,以及一个至少定义以下内容的PHP文件:

  1. 使用Timber::context()(以前是get_context(),已弃用)生成的给定帖子的Timber上下文
  2. 应使用哪个树枝文件(或多个文件)来渲染模板

最简单的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.phpsingle.twig),然后将header.twig文件包含在您的模板中{% include 'header.twig' %}使用模板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's Getting Started guide中。

密钥TL; DR点是:

  1. 每个帖子一次定义Timber上下文
  2. 上下文及其所有值直接从帖子的PHP模板传递到其Twig模板
  3. Twig局部不直接绑定到特定于局部的PHP文件。
  4. Tli模板中包含的
  5. Partials从该模板继承Timber上下文。嵌套在这些局部中的局部也是如此。