WordPress база данных, хранящая вопрос массива - PullRequest
0 голосов
/ 13 января 2020

Я говорю с 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 ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...