Intereting Posts
Меню дрезины – отделители между детьми? get_template_part () не работает, если вы вызываете его, когда находитесь в подпапке Как изменить шаблон страницы навалом? как ограничить поиск заголовков сообщений? Подробный плагин формы, с возможностью экспорта в Excel и т. Д. Или редактировать PDF в реальном времени? Режим отладки показывает строгие стандарты Как перенести данные из дочерней установки в родительскую тему блог wordpress в подкаталоге или поддомене шаблон пользовательской модели woocommerce Электронная почта существует в ERROR в форме регистрации Ajax Как создать простую навигационную систему пользовательских категорий типа публикации и ее сообщений? Как проверить правильность строки? добавить класс span и i tag внутри тега привязки ссылок wp_nav_menu Применить класс к каждому абзацу, который содержит изображение? Как уменьшить количество загружаемых файлов в каждый плагин?

Почему этот глобальный массив возвращает NULL из функции обратного вызова

Это заставило меня сумасшедшим часами … Пожалуйста, скажите мне, почему массив $ ppk_fields пуст в функции ppk_field_callback? Обратите внимание, что он возвращает правильные значения в функции ppk_default_id, но это не функция обратного вызова. Спасибо!

ppk.php

class Ppk { public function ini() { add_action( 'admin_menu', array( $this, 'add_ppk_p_menu' ) ); } public function add_ppk_p_menu() { add_submenu_page( 'tools.php', 'PPK PLUGIN', 'PPK PLUGIN', 'manage_options', 'ppk_p', array( $this, 'ppk_build_dashboard' ) ); } public function ppk_build_dashboard() { require_once plugin_dir_path( __FILE__ ) . 'ppk-builder.php'; } } if ( class_exists( 'Ppk' ) ) { $ppk = new Ppk(); $ppk->ini(); } 

ППК-builder.php

 $ppk_sections = [ 'section_1' => [ 'title' => 'Group One' ] ]; $ppk_fields = [ 'field 1' => [ 'title' => 'Fieald One', 'type' => 'text', 'section' => 'section_1', 'default' => 'default' ] ]; register_setting( 'ppk-builder', 'ppk-builder', 'ppk-builder_validate' ); foreach ($ppk_sections as $id => $value) { add_settings_section( $id, $value['title'], 'ppk_section_callback', 'ppk_p'); } foreach ($ppk_fields as $id => $value) { add_settings_field( $id, $value['title'], 'ppk_field_callback', 'ppk_p', $value['section'], $id ); } function ppk_section_callback() {return null;} function ppk_default_id( $id ) { global $ppk_fields; return $ppk_fields[ $id ]['default']; } function ppk_field_callback($id) { global $ppk_fields; $option = get_option('ppk-builder'); $id_field = isset($option[$id]) ? $option[$id] : ppk_default_id($id); switch ($ppk_fields[$id]['type']) { case 'text': echo '<input type="text" name="ppk-builder[' . $id . ']" value="' . $id_field . '"/>'; break; } } settings_fields( 'ppk-builder' ); do_settings_sections( 'ppk_p' ); 

Solutions Collecting From Web of "Почему этот глобальный массив возвращает NULL из функции обратного вызова"

Проблема здесь в том, что вы никогда не создавали $ppk_fields как глобальную переменную.

 $ppk_fields = [ 'field 1' => [ 'title' => 'Fieald One', 'type' => 'text', 'section' => 'section_1', 'default' => 'default' ] ]; 

Здесь у нас есть переменная, которая создается нормально и подчиняется нормальным правилам определения области. Это не глобальная переменная, и никто не заявил, что это глобальная переменная.

Далее по файлу мы имеем:

 function ppk_field_callback($id) { global $ppk_fields; 

Но глобальная переменная $ppk_fields не определена, ее никто не определял. Вы должны объявлять переменную как глобальную при каждом ее использовании, и это включает в себя создание и уничтожение. Без исключений.

Поэтому вам нужно:

  • объявить, что переменная является глобальной, когда вы определяете ее, используя global $ppk_fields

Делать неправильно

Но есть еще большая проблема. Самая большая проблема заключается в том, что вы использовали глобальные переменные вообще. Глобальные переменные – отличный способ избежать структурирования вашей программы, разбить единичные тесты и ввести излишнюю сложность

Например, глобальные переменные были бы излишними, если бы вы поместили весь вышеприведенный код внутри класса. Тогда $this->fields будут использоваться вами.

Вот пример:

ppk_settings.php:

 class PPK_Settings { private $sections; private $fields; function __construct() { $this->sections = [ 'section_1' => [ 'title' => 'Group One' ] ]; $this->fields = [ 'field 1' => [ 'title' => 'Fieald One', 'type' => 'text', 'section' => 'section_1', 'default' => 'default' ] ]; } function register() { register_setting( 'ppk-builder', 'ppk-builder', 'ppk-builder_validate' ); foreach ($this->sections as $id => $value) { add_settings_section( $id, $value['title'], array( $this, 'section_callback' ), 'ppk_p'); } foreach ($this->fields as $id => $value) { add_settings_field( $id, $value['title'], array( $this, 'ppk_field_callback' ), 'ppk_p', $value['section'], $id ); } } // etc... other methods go here } 

Применение:

 require_once( 'ppk_settings.php' ); $settings = new PPK_Settings(); $settings->register(); 

Вместо этого вы можете использовать путь OO и иметь PPK_Field и PPK_Section , чтобы вы могли определять свои поля, а затем перебирать объекты массива, без проблем или проблем с их доступом, и нет необходимости в глобальных переменных или переменных-членах