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

时间:2017-10-04 23:16:38

标签: php wordpress carbon-fields carbon-fields-2

首先我下载了​​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')
        ) );
}

到目前为止,一切看起来都很好,因为&#34;主题选项&#34;出现在WP后端,就像预期一样。

screenshot Carbon Fields works in WP backend

现在我尝试按如下方式检索字段值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' )不起作用。实际上,对于&#34;简单的字段&#34;但是有复杂的领域&#34;必须由插件自己的函数检索,在这种情况下为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的全新安装),Twenty Sixteen 1.3,PHP 7

1 个答案:

答案 0 :(得分:0)

这是我与其中一位插件作者之间聊天的引用&#34; Atanas Angelov&#34;:

  

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

所以这里有一个确认的方法来引导碳场:

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应该是最早获得字段值的


澄清说明&amp;相关性

仅当您要在主题文件之前检索数据时,这才有意义,因为加载主题文件时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

所有&#34; carbon_get _ *&#34; carbon_get_post_meta()carbon_get_term_meta()carbon_get_user_meta()carbon_get_comment_meta()等功能。

适用于

如果您想要在主题文件之前检索数据,请确保在carbon_fields_fields_registered动作挂钩上发生这种情况,或者已经解雇了挂钩。

如果你开发一个WP插件,你可以在其中集成Carbon Fields(对我来说这是真的)。当你引导你的插件时,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 )设置的值(与Carbon Fields方法相比)。