Как обернуть html вокруг API настроек добавить раздел настроек ()


Я пишу плагин и в настоящее время внедряю свое меню администратора с помощью API настроек wordpress . Как всегда с API, это в определенной степени облегчает программирование, но, похоже, у меня проблема:

Мне нужно обернуть пользовательский html вокруг этих разделов. Например, я хочу обернуть элементы формы вокруг набора полей или расположить логические единицы в два столбца с помощью CSS (float: справа, float: слева). Для этого мне нужно упаковать эти секции в контейнер.

Это функция API, которая повторяет разделы.

function do_settings_sections( $page ) {
        global $wp_settings_sections, $wp_settings_fields;

        if ( ! isset( $wp_settings_sections[$page] ) )
                return;

        foreach ( (array) $wp_settings_sections[$page] as $section ) {
                if ( $section['title'] )
                        echo "<h3>{$section['title']}</h3>\n";

                if ( $section['callback'] )
                        call_user_func( $section['callback'], $section );

                if ( ! isset( $wp_settings_fields ) || !isset( $wp_settings_fields[$page] ) || !isset( $wp_settings_fields[$page][$section['id']] ) )
                        continue;
                //MY WRAPPING NEEDS TO START HERE
                echo '<table class="form-table">';
                do_settings_fields( $page, $section['id'] );
                echo '</table>';
                //AND END HERE!
        }
}

Насколько я правильно прочитал источник, нет способа обернуть вокруг него пользовательский html (только раньше, с помощью параметра add_settings_section ($id, $title, $обратный вызов, $страница) $обратный вызов).

Итак, как бы вы решили эту проблему? Должен ли я просто ввести соответствующие контейнеры в глобальные разделы $wp_settings_sections (с помощью обычного крючка я напишу div, а затем в последнем поле каждого параметра я могу закрыть контейнер с помощью /div. Но это очень, очень уродливый обходной путь, и он, мягко говоря, отталкивает!

Должен ли я отказаться от идеи использования API great settings?

Author: Nikolai Tschacher, 2013-12-05

2 answers

Я только что столкнулся с этой же проблемой сам в проекте, над которым я сейчас работаю.

По сути, я разбил свои настройки на группы, чтобы затем их можно было отобразить в виде отдельного раздела(разделов):

<?php

class MyPluginSettings
{

    /**
     * Constructor.
     *
     * @return void
     * @access public
     */
    public function __construct()
    {
        add_action('admin_menu', array($this, 'myPluginSettingsMenu'));
    }


    /**
     * Register our admin settings menu/page.
     *
     * @return void
     * @access public
     */
    public function myPluginSettingsMenu()
    {
        add_options_page(
            __('My Plugin Settings', TXTDMN),
            __('My Plugin', TXTDMN),
            'manage_options',
            'my-plugin-settings',
            array($this, 'myPluginSettingsPage')
        );

        add_action('admin_init', array($this, 'registerMyPluginSettings'));
    }


    /**
     * Create the admin settings page.
     *
     * @return void
     * @access public
     */
    public function myPluginSettingsPage()
    {

        ?>
        <div class="wrap">
            <h2><?php _e('My Plugin Settings', TXTDMN); ?></h2>
            <hr>
            <p class="howto"><?php _e('<strong class="label">Ahem:</strong> Introductory text/message/warning, etc.', TXTDMN); ?></p>

            <form action="options.php" method="post">

                <?php settings_fields('my-plugin-settings-group'); ?>

                <!-- CUSTOM STYLABLE SECTION #1 -->
                <div class="my-plugin-options section general">
                    <?php do_settings_sections('my-plugin-general-settings'); ?>

                </div>

                <!-- CUSTOM STYLABLE SECTION #2 -->
                <div class="my-plugin-options section special">
                    <?php do_settings_sections('my-plugin-special-settings'); ?>

                </div>

                <!-- CUSTOM STYLABLE SECTION #3 -->
                <div class="my-plugin-options section misc">
                    <?php do_settings_sections('my-plugin-miscellaneous-settings'); ?>

                </div>

            </form>
        </div>
    <?php

    }


    /**
     * Register all of our sections.
     *
     * @return void
     * @access public
     */
    public function registerMyPluginSettings()
    {
        $this->myPluginGeneralSection();
        $this->myPluginSpecialSection();
        $this->myPluginMiscellaneousSection();
    }


    /**
     * My Plugin general options.
     *
     * @return void
     * @access public
     */
    private function myPluginGeneralSection()
    {
        ...
    }


    /**
     * My Plugin special options.
     *
     * @return void
     * @access public
     */
    private function myPluginSpecialSection()
    {
        ...
    }


    /**
     * My Plugin miscellaneous options.
     *
     * @return void
     * @access public
     */
    private function myPluginMiscellaneousSection()
    {
        ...
    }
}

Надеюсь, это поможет и будет иметь для вас смысл:)

Удачи.

 2
Author: Jason D. Moss, 2013-12-08 13:42:54

То, что работает для меня только для стилей css или сценариев js, - это использование admin_enqueue_scripts:

function my_plugin_enqueue($hook) {
    if ( 'settings_page_my-plugin/my-plugin' != $hook ) {
        return;
    }
    wp_register_style( 'my_plugin_admin_css', plugin_dir_url( __FILE__ ) . 'css/my_style_admin.css', false, '1.0.0' );
        wp_enqueue_style( 'my_plugin_admin_css' );

}
add_action( 'admin_enqueue_scripts', 'my_plugin_enqueue' );

И с помощью if ('bla bla bla' != $hook) вы просто return перед любой постановкой в очередь, если это не ваша страница параметров плагина.

$hook похоже, это то, что отправляется на обратный вызов в вызове add_action, и я получил его значение для этой конкретной страницы параметров плагина, просто добавив print_r($hook) на страницу параметров плагина для одной загрузки и вытащил его из браузера.

Меньше хакерский способ сделать это - записать в файл с такой функцией, как:

//For Testing
function write_to_file($message){
        $handle = fopen("/Applications/MAMP/logs/some_file_name.txt", "a+");
        fwrite($handle, "\nMessage:\t " . $message);
        fclose($handle);
    }

Который будет использоваться:

write_to_file($message);

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

 0
Author: MikeiLL, 2015-05-01 02:30:23