Добавить новый флажок в настройках темы

Я пытаюсь добавить новую опцию на панель параметров темы, чтобы скрыть / показать ссылки комментариев в файлах шаблонов темы.

У меня есть возможность отображаться в панели, но есть что-то не так, потому что это не работает, и нет ошибок php. Я отметил ниже в разделе « Основные параметры», где я добавил параметр в качестве массива и где он подвергся санитарной обработке и проверен.

И внизу находится php, который показывает / скрывает ссылки комментариев в соответствии с настройками параметров.

Это логическая проблема php? И идеи?

Код основных опций:

/** * Describe the available options **/ $vertigo_options_template = array( array( 'name' => __( 'Accent Color', 'vertigo' ), 'desc' => __( 'Change the accent color by entering a HEX color number. (ie: <code>EE3322</code>)', 'vertigo' ), 'id' => 'accent_color', 'std' => 'ee3322', 'type' => 'colorpicker' ), array( 'name' => __( 'Font', 'vertigo' ), 'desc' => __( 'Enable Hitchcock custom font (Note: this font only supports basic Latin uppercase letters, numerals, and some punctuation.)', 'vertigo' ), 'id' => 'vertigo_font', 'std' => ( '1' == get_option( 'lang_id' ) ) ? 'true' : 'false', 'type' => 'checkbox' ), /** My new Option **/ array( 'name' => __( 'Comments', 'vertigo' ), 'desc' => __( 'Disable comment links)', 'vertigo' ), 'id' => 'disable_comments_link', 'std' => ( '1' == get_option( 'lang_id' ) ) ? 'true' : 'false', 'type' => 'checkbox' ), ); /** * Calculate default option values * * @return array **/ function vertigo_get_default_options() { global $vertigo_options_template; $default_options = array(); foreach ( $vertigo_options_template as $option ) $default_options[$option['id']] = $option['std']; return $default_options; } /** * Create the options form **/ function vertigo_theme_options_do_page() { global $vertigo_options_template; if ( ! isset( $_REQUEST['settings-updated'] ) ) $_REQUEST['settings-updated'] = false; ?> <div class="wrap"> <?php screen_icon(); echo "<h2>" . get_current_theme() . ' ' . __( 'Theme Options', 'vertigo' ) . "</h2>"; ?> <?php if ( false !== $_REQUEST['settings-updated'] ) : ?> <div class="updated fade"><p><strong><?php _e( 'Options saved.', 'vertigo' ); ?></strong></p></div> <?php endif; ?> <form method="post" action="options.php"> <?php settings_fields( 'vertigo_options' ); ?> <?php $vertigo_options = vertigo_get_theme_options(); ?> <table class="form-table"> <?php foreach ( $vertigo_options_template as $option ) { // Use default value if no option exists $value = ( isset ( $vertigo_options[$option['id']] ) && !empty( $vertigo_options[$option['id']] ) ? $vertigo_options[$option['id']] : $option['std'] ); ?> <tr valign="top"> <th scope="row"> <?php echo $option['name']; ?> </th> <td> <?php switch ( $option['type'] ) { case 'colorpicker': ?> <input type="text" name="vertigo_theme_options[<?php echo esc_attr( $option['id'] ); ?>]" id="<?php echo esc_attr( $option['id'] ); ?>" value="<?php echo esc_attr( $value ); ?>" class="color { pickerPosition:'right' }" /> <?php break; case 'checkbox': ?> <input type="checkbox" name="vertigo_theme_options[<?php echo esc_attr( $option['id'] ); ?>]" id="<?php echo esc_attr( $option['id'] ); ?>" value="true" <?php echo ( 'true' == $value ) ? 'checked="checked"' : ''; ?> /> <?php break; default: break; } // END switch ?> <label class="description" for="<?php echo esc_attr( $option['id'] ); ?>"> <?php echo $option['desc']; ?> <?php if ( 'vertigo_font' == $option['id'] ) { ?> <img src="<?php echo get_template_directory_uri(); ?>/inc/images/hitchcock.gif" alt="Hitchcock" id="hitchcock-sample"/> <?php } ?> </label> </td> </tr> <?php } // END foreach ?> </table> <p class="submit"> <?php submit_button( __( 'Save Options', 'vertigo' ), 'primary', 'submit', false ); ?> <?php submit_button( __( 'Reset Options', 'vertigo' ), 'secondary', 'vertigo_theme_options[reset]', false, array( 'id' => 'reset' ) ); ?> </p> </form> </div><!-- .form-wrap --> <?php } /** * Sanitize and validate form input * * @param array options * @return array sanitized options **/ function vertigo_theme_options_validate( $input ) { global $vertigo_options_template; $defaults = vertigo_get_default_options(); // Check accent color input format // Valid = hexadecimal 3 or 6 digits $accent_color = preg_replace( '/[^0-9a-fA-F]/', '', $input['accent_color'] ); if ( 6 == strlen( $accent_color ) || 3 == strlen( $accent_color ) ) $input['accent_color'] = $accent_color; else $input['accent_color'] = $defaults['accent_color']; // Check that Vertigo font checkbox value is either true or false if ( ! isset( $input['vertigo_font'] ) ) $input['vertigo_font'] = ( $input['vertigo_font'] == 'true' ? 'true' : 'false' ); // My New Option: Check that Disable Comment Links checkbox value is either true or false if ( ! isset( $input['disable_comments_link'] ) ) $input['disable_comments_link'] = ( $input['disable_comments_link'] == 'true' ? 'true' : 'false' ); // Reset to default options if ( ! empty( $input['reset'] ) ) { $defaults = vertigo_get_default_options(); foreach ( $input as $field => $value ) { if ( isset( $defaults[$field] ) ) $input[$field] = $defaults[$field]; else unset( $input[$field] ); } } return $input; } 

И я использую это в своих файлах шаблонов, чтобы показать / скрыть шаблон комментариев:

 <?php if ( 'true' == $vertigo_theme_options['disable_comments_link'] ) { ?> <?php comments_template( '', true ); ?> <?php } ?> 

Вот как выглядят параметры в БД под названием vertigo_theme_options :

 a:3:{s:12:"accent_color";s:6:"EE3322";s:12:"vertigo_font";s:4:"true";s:21:"disable_comments_link";s:5:"true";} 

Редактировать 7/25/11: Это работает в файле шаблона; необходимо сначала вызвать параметры:

 <?php $vertigo_theme_options = get_option( 'vertigo_theme_options' ); ?> <?php if ( 'false' == $vertigo_theme_options['disable_comments_link'] ) { ?> <?php comments_template( '', true ); ?> <?php } ?> 

Solutions Collecting From Web of "Добавить новый флажок в настройках темы"

Чтобы ответить на первую часть вашего вопроса: в вашей настройке уже установлен checkbox ; поэтому, если вы добавите новый флажок, вам не нужно ничего добавлять к коммутатору . Этот код будет применяться ко всем добавляемым вкладкам флажка:

 case 'checkbox': ?> <input type="checkbox" name="vertigo_theme_options[<?php echo esc_attr( $option['id'] ); ?>]" id="<?php echo esc_attr( $option['id'] ); ?>" value="true" <?php echo ( 'true' == $value ) ? 'checked="checked"' : ''; ?> /> <?php break; 

Подробнее о switch с руководства PHP.net и из w3schools .

Я немного смущен формулировкой вашего вопроса:

У меня есть возможность отображать в панели через массив

против

Я заметил ниже … где, как мне кажется, мне нужно добавить его в раздел «Создать форму» в php, который создает форму.

Итак: установлен ли новый флажок в форме страницы настроек или он не отображается ?

РЕДАКТИРОВАТЬ

Поскольку поле настройки отображается правильно в форме настроек, я попытаюсь решить следующие две проблемы: опция не сохраняется должным образом, а опция не выводится правильно.

Прежде всего: это вариант, который правильно сохраняет свое значение в БД, в зависимости от выбора поля формы настроек?

Если это не правильно , то проблема может заключаться в том, что вы не проверяете ее должным образом. Если установлен флажок, если флажок не включен, то весь параметр будет опущен из данных POST. В этом случае, чтобы сохранить его значение в БД, вам нужно проверить установленное значение параметра, например:

 <?php $vertigo_options['disable_comments_link'] = ( isset( $_POST['disable_comments_link'] ) ? true : false ); ?> 

Примечание. Вы хотите настроить, но вы дезинфицируете данные формы. Если вы использовали API настроек, это выглядело бы следующим образом:

 <?php $output['disable_comments_link'] = ( isset( $input['disable_comments_link'] ) ? true : false ); ?> 

Это приближает нас?

EDIT 2

Поэтому мы знаем, что опция правильно сохраняется в БД. Теперь нам просто нужно получить его для корректного вывода в шаблон.

Следующий вопрос: есть ли опции, хранящиеся в БД, или как массив?

Из разметки формы настроек вы увидите, что параметры хранятся в виде массива , поэтому нам нужно вызвать get_option() в массиве , а затем использовать значения в этом массиве:

 <?php $vertigo_theme_options = get_option( 'vertigo_options' ); ?> 

Примечание. Чтобы найти фактическое имя записи базы данных, обратитесь к функции vertigo_get_theme_options() . Вы также можете просто вызвать эту функцию:

 <?php $vertigo_theme_options = vertigo_get_theme_options(); ?> 

В любом случае, теперь вы должны иметь возможность ссылаться на свою опцию в $vertigo_theme_options ; например:

 <?php if ( 'true' == $vertigo_theme_options['disable_comments_link'] ) { ?> <?php comments_template( '', true ); ?> <?php } ?> 

Это нас достает?

ИЗМЕНИТЬ 3

option_name в wp_options – vertigo_theme_options

Затем попробуйте следующее:

 <?php $vertigo_theme_options = get_option( 'vertigo_theme_options' ); ?> <?php if ( 'true' == $vertigo_theme_options['disable_comments_link'] ) { ?> <?php comments_template( '', true ); ?> <?php } ?> 

Я почти на 100% уверен, что это должно это сделать.

на самом деле не отвечает на ваш вопрос, но, как хэдз-ап, есть несколько действительно хороших плагинов для создания вариантов темы. для меня это почти не стоит усилий, чтобы сделать это сам.

http://wordpress.org/extend/plugins/options-framework/