如何将html包装在设置API添加_设置_节()

时间:2013-12-05 作者:Nikolai Tschacher

我正在编写一个插件,目前正在使用wordpress实现我的管理菜单settins API. 与API一样,它在一定程度上促进了编程,但似乎我有一个问题:

我需要围绕这些部分包装自定义html。例如,我想将表单元素包装在字段集周围,或者我想使用CSS将逻辑单元定位到两列中(float:right,float:left)。为此,我需要将这些部分打包到一个容器中。

这是回送节的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\\u settings\\u部分($id,$title,$callback,$page)$callback参数之前)。

那么你会如何解决这个问题呢?我是否应该将适当的容器注入全局$wp\\u settings\\u部分(使用普通钩子,我将写入div,然后在每个设置的最后一个字段中,我可以使用/div关闭容器。但这是一个非常非常丑陋的解决方法,至少可以说是令人反感的!

我应该放弃使用伟大的设置API吗?

2 个回复
最合适的回答,由SO网友:Jason D. Moss 整理而成

我在目前正在进行的一个项目中遇到了同样的问题。

基本上,我所做的是将我的设置分成多个组,以便它们可以显示为一个单独的部分:

<?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()
    {
        ...
    }
}
希望这对您有所帮助并有意义:)

祝你好运

SO网友:MikeiLL

对于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);
而且您可以避免关于已经编写的标题的丑陋消息。

结束

相关推荐