Creating Theme Options Page

时间:2013-05-14 作者:Jeremy

我正在根据教程创建一个主题选项页Tom McFarlin at TutsPlus 我有点困了。我不明白这里的代码哪里出错了,因为它根本不允许我在执行时访问该站点。

有没有更简单的方法来完成文本输入和主题选项?

/* =VOTE THEME OPTIONS
---------------------------------------------------- */

/**
 * This function introduces the theme options into the \'Appearance\' menu and into a top-level 
 * \'Vote Theme\' menu.
 */
function vote_example_theme_menu() {

    add_theme_page(
        \'Vote Theme\',                   // The title to be displayed in the browser window for this page.
        \'Vote Theme\',                   // The text to be displayed for this menu item
        \'administrator\',                    // Which type of users can see this menu item
        \'vote_theme_options\',           // The unique ID - that is, the slug - for this menu item
        \'vote_theme_display\'                // The name of the function to call when rendering this menu\'s page
    );

    add_menu_page(
        \'Vote Theme\',                   // The value used to populate the browser\'s title bar when the menu page is active
        \'Vote Theme\',                   // The text of the menu in the administrator\'s sidebar
        \'administrator\',                    // What roles are able to access the menu
        \'vote_theme_menu\',              // The ID used to bind submenu items to this menu 
        \'vote_theme_display\'                // The callback function used to render this menu
    );

    add_submenu_page(
        \'vote_theme_menu\',
        __( \'Header Options\', \'vote\' ),
        __( \'Header Options\', \'vote\' ),
        \'administrator\',
        \'vote_theme_header_options\',
        create_function( null, \'vote_theme_display( "header_options" );\' )
    );


} // end vote_example_theme_menu
add_action( \'admin_menu\', \'vote_example_theme_menu\' );

/**
 * Renders a simple page to display for the theme menu defined above.
 */
function vote_theme_display( $active_tab = \'\' ) {
?>
    <!-- Create a header in the default WordPress \'wrap\' container -->
    <div class="wrap">

        <div id="icon-themes" class="icon32"></div>
        <h2><?php _e( \'Vote Theme Options\', \'vote\' ); ?></h2>
        <?php settings_errors(); ?>

        <?php if( isset( $_GET[ \'tab\' ] ) ) {
            $active_tab = $_GET[ \'tab\' ];
        } else {
            $active_tab = \'header_options\';
        } // end if/else ?>

        <h2 class="nav-tab-wrapper">
            <a href="?page=vote_theme_options&tab=header_options" class="nav-tab <?php echo $active_tab == \'header_options\' ? \'nav-tab-active\' : \'\'; ?>"><?php _e( \'Header Options\', \'vote\' ); ?></a>
        </h2>

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

                if ( $active_tab == \'header_options\' ) {

                    settings_fields( \'vote_theme_header_options\' );
                    do_settings_sections( \'vote_theme_header_options\' );

                } else {

                    settings_fields( \'vote_theme_header_options\' );
                    do_settings_sections( \'vote_theme_header_options\' );

                }// end if/else

                submit_button();

            ?>
        </form>

    </div><!-- /.wrap -->
<?php
} // end vote_theme_display

/* ------------------------------------------------------------------------ *
 * Setting Registration
 * ------------------------------------------------------------------------ */ 

/**
 * Provides default values for the Header Options.
 */
function vote_theme_default_header_options() {

    $defaults = array(
        \'elect_city\'        =>  \'\',
        \'elect_name\'        =>  \'City Council\',
        \'elect_year\'        =>  \'\',
        \'elect_type\'        =>  \'Election\',
        \'elect_date_month\'  =>  \'\',
        \'elect_date_day\'    =>  \'\',
    );

    return apply_filters( \'vote_theme_default_header_options\', $defaults );

} // end vote_theme_default_header_options

/**
 * Initializes the theme\'s input example by registering the Sections,
 * Fields, and Settings. This particular group of options is used to demonstration
 * validation and sanitization.
 *
 * This function is registered with the \'admin_init\' hook.
 */ 
function vote_theme_initialize_header_options() {

    if( false == get_option( \'vote_theme_header_options\' ) ) {  
        add_option( \'vote_theme_header_options\', apply_filters( \'vote_theme_default_header_options\', vote_theme_default_header_options() ) );
    } // end if

    add_settings_section(
        \'header_options_section\',
        __( \'Header Options\', \'vote\' ),
        \'vote_header_options_callback\',
        \'vote_theme_header_options\'
    );

    add_settings_field( 
        \'Election City\',                        
        __( \'Election City\', \'vote\' ),                          
        \'vote_elect_city_callback\', 
        \'vote_theme_header_options\',    
        \'header_options_section\'            
    );

    add_settings_field( 
        \'Election Name\',                        
        __( \'Election Name\', \'vote\' ),                          
        \'vote_elect_name_callback\', 
        \'vote_theme_header_options\',    
        \'header_options_section\'            
    );

    add_settings_field(
        \'Election Year\',                        
        __( \'Election Year\', \'vote\' ),                          
        \'vote_elect_year_callback\', 
        \'vote_theme_header_options\',
        \'header_options_section\'    
    );

    add_settings_field(
        \'Election Type\',                        
        __( \'Election Type\', \'vote\' ),                          
        \'vote_elect_type_callback\', 
        \'vote_theme_header_options\',
        \'header_options_section\'    
    );

    add_settings_field(
        \'Election Date: Month\',                     
        __( \'Election Date: Month\', \'vote\' ),                           
        \'vote_elect_date_month_callback\',   
        \'vote_theme_header_options\',
        \'header_options_section\'    
    );

    add_settings_field(
        \'Election Date: Day\',                       
        __( \'Election Date: Day\', \'vote\' ),                         
        \'vote_elect_date_day_callback\', 
        \'vote_theme_header_options\',
        \'header_options_section\'    
    );

    register_setting(
        \'vote_theme_header_options\',
        \'vote_theme_header_options\',
        \'vote_theme_validate_header_options\'
    );

} // end vote_theme_initialize_header_options
add_action( \'admin_init\', \'vote_theme_initialize_header_options\' );

/* ------------------------------------------------------------------------ *
 * Section Callbacks
 * ------------------------------------------------------------------------ */ 

/**
 * This function provides a simple description for the Input Examples page.
 *
 * It\'s called from the \'vote_theme_intialize_header_options_options\' function by being passed as a parameter
 * in the add_settings_section function.
 */
function vote_header_options_callback() {
    echo \'<p>\' . __( \'Provide input for the page header section.\', \'vote\' ) . \'</p>\';
} // end vote_header_options_callback

/* ------------------------------------------------------------------------ *
 * Field Callbacks
 * ------------------------------------------------------------------------ */ 

/**
 * This function renders the interface elements for toggling the visibility of the header element.
 * 
 * It accepts an array or arguments and expects the first element in the array to be the description
 * to be displayed next to the checkbox.
 */

function vote_header_options_callback() {

    $options = get_option( \'vote_theme_header_options\' );

    // Render the output
    echo \'<input type="text" id="elect_city" name="vote_theme_header_options[elect_city]" value="\' . $options[\'elect_city\'] . \'" />\';

} // end vote_elect_city_callback

function vote_elect_name_callback() {

    $options = get_option( \'vote_theme_header_options\' );

    // Render the output
    echo \'<input type="text" id="elect_name" name="vote_theme_header_options[elect_name]" value="\' . $options[\'elect_name\'] . \'" />\';

} // end vote_elect_name_callback

function vote_elect_year_callback($year_limit = 0) {

    $options = get_option( \'vote_theme_header_options\' );

    $html = \'<select id="elect_year" name="vote_theme_header_options[elect_year]">\';
        for ($year = 2014; $year <= (date("Y") - $year_limit); $year++) {
            $html .= \'<option value="\' . $year . \'"\' . selected( $options[\'elect_year\'], $year, false) . \'>\' . __( $year, \'vote\' ) . \'</option>\'."\\n";
        }

    echo $html;

} // end vote_elect_year_callback

function vote_elect_type_callback() {

    $options = get_option( \'vote_theme_header_options\' );

    // Render the output
    echo \'<input type="text" id="elect_type" name="vote_theme_header_options[elect_type]" value="\' . $options[\'elect_type\'] . \'" />\';

} // end vote_elect_type_callback

function vote_elect_date_month_callback() {

    $options = get_option( \'vote_theme_header_options\' );

    $html = \'<select id="elect_date_month" name="vote_theme_header_options[elect_date_month]">\';
        $months = array("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
        for ($month = 1; $month <= 12; $month++) {
            $html .= \'<option value="\' . $month . \'"\' . selected( $options[\'elect_date_month\'], $month, false) . \'>\' . __( $months[$month], \'vote\' ) . \'</option>\'."\\n";
        }

    echo $html;

} // end vote_elect_date_month_callback

function vote_elect_date_day_callback() {

    $options = get_option( \'vote_theme_header_options\' );

    $html = \'<select id="elect_date_day" name="vote_theme_header_options[elect_date_day]">\';
        for ($day = 1; $day <= 31; $day++) {
            $html .= \'<option value="\' . $day . \'"\' . selected( $options[\'elect_date_day\'], $day, false) . \'>\' . __( $day, \'vote\' ) . \'</option>\'."\\n";
        }

    echo $html;

} // end vote_elect_date_month_callback

/* ------------------------------------------------------------------------ *
 * Setting Callbacks
 * ------------------------------------------------------------------------ */ 

/**
 * Sanitization callback for the social options. Since each of the social options are text inputs,
 * this function loops through the incoming option and strips all tags and slashes from the value
 * before serializing it.
 *  
 * @params  $input  The unsanitized collection of options.
 *
 * @returns         The collection of sanitized values.
 */

function vote_theme_validate_header_options( $input ) {

    // Create our array for storing the validated options
    $output = array();

    // Loop through each of the incoming options
    foreach( $input as $key => $value ) {

        // Check to see if the current option has a value. If so, process it.
        if( isset( $input[$key] ) ) {

            // Strip all HTML and PHP tags and properly handle quoted strings
            $output[$key] = strip_tags( stripslashes( $input[ $key ] ) );

        } // end if

    } // end foreach

    // Return the array processing any additional functions filtered by this action
    return apply_filters( \'vote_theme_validate_header_options\', $output, $input );

} // end vote_theme_validate_header_options

?>

1 个回复
最合适的回答,由SO网友:JMau 整理而成

vote_header_options_callback() 已声明两次!尝试两次声明相同的函数名将导致致命的PHP错误。

为函数指定另一个名称。

结束

相关推荐