3

首先我下载了​​ https://carbonfields.net/zip/latest/并在 WP 后端安装了插件。我也激活了它。

对于这个测试用例,我使用“Twenty Sixteen”模板和全新的 WordPress 安装,没有安装任何其他插件,根据Carbon Fields 的文档页面,我将以下代码添加到我的 functions.php 文件的顶部:

<?php // PHP 7
use Carbon_Fields\Container;
use Carbon_Fields\Field;

add_action( 'carbon_fields_register_fields', 'crb_attach_theme_options' );
function crb_attach_theme_options() {
    Container::make( 'theme_options', 'Theme Options' )
        -> set_page_menu_position( 0 )
        -> add_fields( array(
            Field::make( 'text', 'crb_text')
        ) );
}

到目前为止一切看起来都很好,因为“主题选项”正如预期的那样出现在 WP 后端。

屏幕截图 Carbon Fields 在 WP 后端工作

现在我尝试crb_text按如下方式检索字段值:

// this snippet starts exactly where the previous one ended
add_action( 'after_setup_theme', 'crb_load' );
function crb_load() {
    // require_once( ABSPATH . '/vendor/autoload.php' ); original from website throws: "Failed opening required" so modified to:
    require_once( ABSPATH . 'wp-content/plugins/carbon-fields/vendor/autoload.php' );
    \Carbon_Fields\Carbon_Fields::boot();
    var_dump( carbon_get_theme_option( 'crb_text' ) ); // -> string(0) ""
    var_dump( carbon_get_theme_option( '_crb_text' ) ); // -> string(0) "" isn't actually the right way to do it but give it a try for testing purpose
    var_dump( get_option( '_crb_text' ) ); // -> string(4) "test"
}

如您所见,我可以通过调用get_option( '_crb_text' )原生 WP 方式来检索数据,但插件功能carbon_get_theme_option( 'crb_text' )不起作用。carbon_get_theme_option()实际上,这对于“简单字段”来说很好,但是在这种情况下,插件自己的函数必须检索“复杂字段” 。

我也确实看过这个问题:use Carbon Fields in custom plugin class。但是这个问题在我开始的地方结束。

先感谢您...


PS:我习惯使用 Carbon Fields 1.6,它可以在非常相似的设置下正常工作,但想升级到分支 2。


我的环境又是:define('WP_DEBUG', true);,Carbon Fields 2.1.0,WordPress 4.8.2–de_DE(全新安装,除了 Carbon Fields 之外没有其他插件),二十六个 1.3,PHP 7

4

1 回答 1

3

这是我与插件作者之一“Atanas Angelov”聊天的引述:

嗨@Elstermann,您无法获得该值,因为为了获得字段的值,必须首先定义它。所有字段都在 carbon_fields_fields_registered 钩子中定义,因此在该钩子触发之前的任何 carbonget* 调用都将不起作用(因为尚未定义任何字段)。

因此,这是一种已确认的引导 Carbon Fields 的方法:

use Carbon_Fields\Container;
use Carbon_Fields\Field;

add_action( 'carbon_fields_register_fields', 'crb_attach_theme_options' );
function crb_attach_theme_options() {
    Container::make( 'theme_options', 'Theme Options' ) -> add_fields( array(
        Field::make( 'text', 'crb_text')
    ) );
}

add_action( 'after_setup_theme', 'crb_load' );
function crb_load() {
    require_once( ABSPATH . 'wp-content/plugins/carbon-fields/vendor/autoload.php' );
    \Carbon_Fields\Carbon_Fields::boot();
}

add_action( 'carbon_fields_fields_registered', 'crb_values_are_avail' );
function crb_values_are_avail() {
    var_dump( carbon_get_theme_option( 'crb_text' ) ); // -> string(0) "test"
}

只是为了强调这里的核心问题......这是对上面片段的回复:

是的 -carbon_fields_fields_registered应该是最早可以获得字段值的时间


澄清和相关性说明

这仅在您想早于主题文件中检索数据时才相关,因为在carbon_fields_fields_registered加载主题文件时动作挂钩已经触发。因此,在您的主题文件中,只需调用以下命令就可以了:

carbon_get_theme_option( 'your_name_of_a_carbon_field' );
// for example in the "header.php" in your theme directory you could use
<style>body{background-color:<?php
    echo carbon_get_theme_option( 'custom_body_background' );
?>}</style> // just to give a real life like example

这适用于所有“carbon_get_*”函数,例如carbon_get_post_meta(), carbon_get_term_meta(), carbon_get_user_meta(), carbon_get_comment_meta()


对...有用

如果您想在主题文件之前检索数据,请确保这发生在carbon_fields_fields_registered动作钩子上或钩子已经被触发。

如果您开发一个集成了 Carbon Fields 的 WP 插件(这对我来说是正确的),则可能会出现这种情况。当你引导你的插件时,carbon_fields_fields_registered动作钩子没有发生,所以确保有正确的时机。

选择

正如问题中提到的,您还可以使用:

get_option( '_your_field_name_prepended_by_lodash' )

当您要检索由以下设置的数据时:

Container::make( 'theme_options', 'Theme Options' ) -> add_fields()

但这伴随着以下缺点:

  1. 这不适用于复杂字段和
  2. 您无权访问由设置的值Field::make(...)->set_default_value( $default_value )(与 Ca​​rbon Fields 方法相反)。
于 2017-10-05T01:01:22.127 回答