如何从 "Carbon Fields 2.1.0" WP-plugin 中检索字段值?他们在哪个阶段可以访问?

How to retrieve field values from "Carbon Fields 2.1.0" WP-plugin? At which phase are they accessible?

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

对于这个测试用例,我使用 "Twenty Sixteen" 模板和全新的 WordPress 安装,没有安装任何其他插件,并且根据 documentation page of 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')
        ) );
}

到目前为止一切看起来都很好,因为 "Theme Options" 正如预期的那样出现在 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' ) 不起作用。实际上,这对 "simple fields" 没问题,但是有 "complex fields" 必须由插件自己的函数检索,在这种情况下是 carbon_get_theme_option()

我也看过这个问题:。但是这个问题在我的问题开始的地方结束。

提前谢谢你...


PS:我习惯使用 Carbon Fields 1.6,它在非常相似的设置下运行良好,但想升级到分支 2。


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

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

Hi @Elstermann you couldn't get the value because in order to get a field's value it has to be defined first. All fields are defined in the carbon_fields_fields_registered hook so any carbonget* calls before that hook has fired will not work (since no fields are defined yet).

所以这是 bootstrap 碳田的一种确认方式:

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"
}

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

Yes - carbon_fields_fields_registered should be the earliest you can get a field's value


澄清和相关性注释

这仅在您想比主题文件中更早检索数据时才有意义,因为 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 操作挂钩上或者挂钩已经被触发。

如果您开发了一个 WP 插件并在其中集成了 Carbon Fields(这对我来说就是如此),则可能会出现这种情况。当你 bootstrap 你的插件时 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 ) 设置的值(与碳场方法相反)。