Я говорю с wordpress , и у меня возникает проблема с сохранением массива в базе данных с помощью функции очистки обратного вызова , эта проблема возникает, когда у меня нет опции в базе данных, которая У меня такое же имя, как и у опции, которую я пытаюсь сохранить (первое сохранение), функция получает массив ввода, используя эту форму:
<form method="post" action="options.php">
<?php
settings_fields( 'bestknight_plugin_cpt_settings' );
do_settings_sections( 'Bestknight_cpt' );
submit_button();
?>
</form>
Я зарегистрировал настройки и поля, используя эту функцию:
public function registerCustomFields()
{
// register setting
$args = array(
'type' => $this->settings['type'],
'group' => $this->settings['option_group'],
'description' => '',
'sanitize_callback' => ( isset( $this->settings['callback'] ) ? $this->settings['callback'] : null ),
'show_in_rest' => false,
);
register_setting( $this->settings['option_group'], $this->settings['option_name'], $args );
// add settings section
foreach ( $this->sections as $section ) {
add_settings_section( $section["id"], $section["title"], ( isset( $section["callback"] ) ? $section["callback"] : '' ), $section["page"] );
}
// add settings field
foreach ( $this->fields as $field ) {
add_settings_field( $field["id"], $field["title"], ( isset( $field["callback"] ) ? $field["callback"] : '' ), $field["page"], $field["section"], ( isset( $field["args"] ) ? $field["args"] : '' ) );
}
}
Зная, что $ this-> settings , $ this-> section и $ this-> fields равны:
$args = array(
'option_group' => 'bestknight_plugin_cpt_settings',
'option_name' => 'Bestknight_plugin_cpt',
'callback' => array($this->cptCallbacks,'cptSanitize'),
'type' => 'array'
);
$this->Settings->set_settings($args);
$args = array(
array(
'id' => 'bestknight_cpt_index',
'title' => 'Create a New Custom Post Type',
'callback' => array($this->cptCallbacks,'cpt_section_manager'),
'page' => 'Bestknight_cpt'
)
);
$this->Settings->set_sections($args);
$args = array(
array(
'id' => 'post_type',
'title' => 'Custom Post Type ID',
'callback' => array($this->cptCallbacks,'text_field'),
'page' => 'Bestknight_cpt',
'section' => 'bestknight_cpt_index',
'args' => array(
'option_name' => 'Bestknight_plugin_cpt',
'label_for' => 'post_type',
'placeholder' => 'eg. product'
)
),
array(
'id' => 'singular_name',
'title' => 'Singular Name',
'callback' => array($this->cptCallbacks,'text_field'),
'page' => 'Bestknight_cpt',
'section' => 'bestknight_cpt_index',
'args' => array(
'option_name' => 'Bestknight_plugin_cpt',
'label_for' => 'singular_name',
'placeholder' => 'eg. Product'
)
),
array(
'id' => 'plural_name',
'title' => 'Plural Name',
'callback' => array($this->cptCallbacks,'text_field'),
'page' => 'Bestknight_cpt',
'section' => 'bestknight_cpt_index',
'args' => array(
'option_name' => 'Bestknight_plugin_cpt',
'label_for' => 'plural_name',
'placeholder' => 'eg. Products'
)
),
array(
'id' => 'public',
'title' => 'Do you want it Public ?',
'callback' => array($this->cptCallbacks,'checkbox_field'),
'page' => 'Bestknight_cpt',
'section' => 'bestknight_cpt_index',
'args' => array(
'option_name' => 'Bestknight_plugin_cpt',
'label_for' => 'public',
'classes' => 'ui-toggle'
)
),
array(
'id' => 'has_archive',
'title' => 'Will it has an archive ?',
'callback' => array($this->cptCallbacks,'checkbox_field'),
'page' => 'Bestknight_cpt',
'section' => 'bestknight_cpt_index',
'args' => array(
'option_name' => 'Bestknight_plugin_cpt',
'label_for' => 'has_archive',
'classes' => 'ui-toggle'
)
)
);
Функция обратного вызова :
public function cptSanitize( $input )
{
$output = get_option('Bestknight_plugin_cpt');
if ( count($output) == 0 || !$output) {
$output = array($input["post_type"] => $input);
return $output;
}
else
{
foreach ($output as $key => $value) {
if ($input["post_type"] === $key) {
$output[$key] = $input;
} else {
$output[$input["post_type"]] = $input;
}
}
return $output;
}
}
Если я попробую этот код, введя следующие значения в качестве примера:
Bestknight_plugin_cpt[post_type] => "ComickBook"
Bestknight_plugin_cpt[singular_name] => "Comick Book"
Bestknight_plugin_cpt[plural_name] => "ComickBooks"
Bestknight_plugin_cpt[public] => "1"
Bestknight_plugin_cpt[has_archive] => "1"
Данные, которые я получаю в database :
a:1:{s:0:"";a:1:{s:9:"ComicBook";a:5:{s:9:"post_type";s:9:"ComicBook";s:13:"singular_name";s:10:"Comic Book";s:11:"plural_name";s:11:"Comic Books";s:6:"public";s:1:"1";s:11:"has_archive";s:1:"1";}}}
Проблема в том, что данные, которые я возвратил, получают в другом массиве с пустым именем в качестве ключа, поэтому я должен иметь что-то вроде:
a: 1: {s: 9: "ComicBook"; a: 5: {s: 9: "post_type"; s: 9: "ComicBook"; s: 13: "singular_name" ; s: 10: "Comi c Book"; s: 11: "имя_ множественного числа"; s: 11: "Comi c Books"; s: 6: "publi c"; s: 1: "1 "; s: 11:" has_archive "; s: 1:" 1 ";}}
Если я отображаю массив $ output с var_dump () функция до этого я вернусь, я получу хорошее значение:
array (1) { ["ComicBook"] => array (5) {["post_type"] => string (9) "ComicBook" ["singular_name" ] => string (10) "Comi c Book" ["множественное_имя"] => string (11) "Comi c Books" ["publi c"] => string (1) "1" [ "has_archive"] => string (1) "1"}}
Так как я могу хранить данные в нужном мне формате? что я должен вернуть или добавить в массив $ output ?