Как получить значения полей из «Carbon Fields 2.1.0» WP-plugin? На какой стадии они доступны?

Сначала я загрузил https://carbonfields.net/zip/latest/ и установил плагин в WP backend. Я также активировал его.

Для этого тестового примера я использую шаблон «Двадцать шестнадцать» со свежей установкой 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 backend так же, как ожидалось.

скриншот Carbon Fields работает в 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' ) не работает. На самом деле это было бы хорошо для «простых полей», но есть «сложные поля», которые должны быть восстановлены собственными функциями плагинов, которые в этом случае являются carbon_get_theme_option() .

Я также посмотрел на этот вопрос: используйте Carbon Fields в пользовательском классе plugin . Но этот вопрос заканчивается там, где начинается моя.

Заранее спасибо…


PS: Я привык работать с Carbon Fields 1.6, который отлично работает с подобной настройкой, но хочет перейти на ветвь 2.


Моя среда снова: define('WP_DEBUG', true); , Carbon Fields 2.1.0, WordPress 4.8.2-de_DE (новая установка без других плагинов, чем Углеродные поля), Twenty Sixteen 1.3, PHP 7

Это цитата из чата, которую я имел с одним из авторов плагинов «Атанас Ангелов»:

Привет @Elstermann, вы не могли получить значение, потому что для получения значения поля он должен быть определен первым. Все поля определены в hook_fields_fields_registered hook, поэтому любые вызовы 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 action hook уже запущен, когда загружаются ваши файлы тем. Таким образом, в ваших файлах темы должно быть совершенно нормально просто позвонить:

 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 action hook или что урок уже был запущен.

Это может иметь место, если вы разрабатываете плагин WP, в который вы интегрируете Carbon Fields (что верно для меня). Когда вы загружаете свой плагин, carbon_fields_fields_registered action hook не произошло, поэтому убедитесь, что у вас есть правильное время.

альтернатива

Как уже упоминалось в вопросе, вы также можете использовать:

 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).