Как получить значения полей из & quot; Углеродные поля 2.1.0 & quot; WP-плагин? На каком этапе они доступны?

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

Для этого теста я использую шаблон «Twenty Sixteen» со свежей установкой WordPress без установки каких-либо других плагинов и в соответствии с страница документации по углеродным полям Я добавил следующий фрагмент кода в начало моего файла 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() в этом случае.

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

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


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

2

Решение

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

Привет, @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 должно быть как можно раньше, чтобы получить значение поля

Это актуально только в том случае, если вы хотите получить данные раньше, чем в файлах темы, из-за того, что 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 (что верно для меня). Когда вы запускаете плагин 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).
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]