如何从 "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()
但这伴随着以下缺点:
- 这不适用于复杂字段并且
- 您无权访问
Field::make(...)->set_default_value( $default_value )
设置的值(与碳场方法相反)。
首先我下载了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()
但这伴随着以下缺点:
- 这不适用于复杂字段并且
- 您无权访问
Field::make(...)->set_default_value( $default_value )
设置的值(与碳场方法相反)。