GET_THEME_MOD仅返回FALSE

时间:2019-06-22 作者:OctaviaLo

我创建了一个自定义部分,其中有一个控件,允许用户从下拉列表中选择字体。然而,当我使用get\\u theme\\u mod()函数,并将结果回显到标题中的styles标记时,我什么也得不到。

调试器告诉我get\\u theme\\u mod()返回“false”,而我希望它返回所选项目的值。使用get\\u option()可以得到选项的键“value3”,而不是值。

我更喜欢使用get\\u theme\\u mod(),因为这是函数的作用,但是如果我不能,我如何让它输出“American Typewriter”而不是“value3”?

functions.php

function lettra_customized_css()
{
 ?>
  <style type=\'text/css\'>
    .site-title {
      <?php 
      $foo = get_option(\'title_font\'); // "value3"
      $bar = get_theme_mod(\'title_font\');// false
      ?>font-family: <?php echo get_theme_mod(\'title_font\') ?>;
    }
  </style>
<?php
}
add_action(\'wp_head\', \'lettra_customized_css\');

cutomizer.php

function lettra_customize_register($wp_customize)
{
  $wp_customize->add_section(
    \'font_options\',
    array(
      \'title\'       => __(\'Font Options\', \'lettra\'), //Visible title of section
      \'priority\'    => 20, //Determines what order this appears in
      \'capability\'  => \'edit_theme_options\', //Capability needed to tweak
      \'description\' => __(\'Choose font pairings for your theme here.\', \'lettra\'), //Descriptive tooltip
)
  );

  $wp_customize->add_setting(\'title_font\', array(
    \'default\'        => \'Roboto Slab\',
    \'capability\'     => \'edit_theme_options\',
    \'type\'           => \'option\',
    \'transport\'  => \'postMessage\'
  ));

  $wp_customize->add_control(\'title_font_control\', array(
    \'label\'      => __(\'Title Font\', \'lettra\'),
    \'section\'    => \'font_options\',
    \'settings\'   => \'title_font\',
    \'type\'       => \'select\',
    \'choices\'    => array(
      \'value1\' => \'Roboto Slab\',
      \'value2\' => \'Times New Roman\',
      \'value3\' => \'American Typewriter\',
    ),
  ));
}
add_action(\'customize_register\', \'lettra_customize_register\');

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

调试器告诉我get\\u theme\\u mod()返回“false”,而我希望它返回所选项目的值。

get_theme_mod() 不起作用,因为在注册设置时typeoption:

$wp_customize->add_setting(\'title_font\', array(
  \'default\'        => \'Roboto Slab\',
  \'capability\'     => \'edit_theme_options\',
  \'type\'           => \'option\',
  \'transport\'  => \'postMessage\'
));
可能的值type 添加设置时\'option\', 或默认值,\'theme_mod\'.

option 独立于当前主题存储值,并使用get_option(), 虽然theme_mod 仅存储当前主题的值,并使用get_theme_mod().

使用get\\u option()可以得到选项的键“value3”,而不是值。

“键”是值。它是输出到value="" 的属性<option> 标签

如果你想使用这个标签,有两种可能的解决方案。

首先,您可以只传递标签,然后这些标签也将用作值:

array(
  \'Roboto Slab\',
  \'Times New Roman\',
  \'American Typewriter\',
),
或者,您可以独立于两个位置存储对标签的引用:

function wpse_341193_get_font_options() {
    return array(
      \'value1\' => \'Roboto Slab\',
      \'value2\' => \'Times New Roman\',
      \'value3\' => \'American Typewriter\',
    );
}
然后可以将其用作选项:

\'choices\' => wpse_341193_get_font_options(),
和输出:

<?php
$font_options = wpse_341193_get_font_options();
$font_family  = get_theme_mod(\'title_font\');// false
?>font-family: <?php echo $font_options[$font_family] ?>;

SO网友:Aniruddha Gawade

问题1:get_option 而不是get_theme_mod.

存储和检索值的方式取决于传递给add_setting 作用看见https://codex.wordpress.org/Class_Reference/WP_Customize_Manager/add_setting.如果要使用get_theme_mod, 类型应为theme_mod, 这是默认值。

问题2:获取值而不是标签。

当您将选择传递给add_control 函数,这是一个组合了value => label. 因此,值部分将用于存储在DB中,并在以后检索。使用Label 要存储在DB中,可以传递普通数组,或使用标签作为值。

\'choices\'    => array(
  \'Roboto Slab\' => \'Roboto Slab\',
  \'Times New Roman\' => \'Times New Roman\',
  \'American Typewriter\' => \'American Typewriter\',
),

\'choices\'    => array(
  \'Roboto Slab\',
  \'Times New Roman\',
  \'American Typewriter\',
),
希望这有帮助。