web-dev-qa-db-ja.com

テーマオプションに新しいチェックボックスを追加する

テーマオプションパネルに新しいオプションを追加しようとしています テーマテンプレートファイルのコメントリンクを表示/非表示にします。

パネルに表示するオプションがありますが、それが機能せず、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と呼ばれるDBでオプションがどのように見えるかです:

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 } ?>
6
markratledge

あなたの質問の最初の部分に答えるには:あなたの設定フォームはすでにカバーされているcheckboxケースを持っています。したがって、新しいチェックボックス入力を追加する場合は、 スイッチに何も追加する必要はありません 。このコードは、追加したallチェックボックス入力に適用されます。

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;

PHP.netマニュアル および w3schools からのswitchの詳細。

私はあなたの質問の文言に少し混乱しています:

私はアレイを介してパネルに表示するためのオプションを持っています

vs.

以下に書きました...それが現れるところで、私はそれをフォームを構築するphpの "create form"セクションに追加する必要があります。

それで 新しいチェックボックスは現在設定ページフォームに表示されますか、それとも表示されません

_編集_

設定フィールドに設定フィールドが正しく表示されるので、次の2つの問題に取り組みます。オプションが正しく保存されない、オプションが正しく出力されないのです。

まず最初に: 設定フォームフィールドの選択に基づいて、DBにその値を正しく保存するオプションはありますか?

もしそれが 正しく保存されていない の場合、問題はあなたがそれを正しくチェックしていないということかもしれません。チェックボックスの場合、チェックボックスが有効になっていないと、POSTデータからパラメーター全体が省略されます。その場合、その値をDBに保存するには、設定されているオプションの値を確認する必要があります。

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

注:フォームデータをサニタイズしている場合は調整してください。 Settings APIを使用していた場合は、さらに次のようになります。

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

これは私達をより近づかせますか?

編集2

だから我々はオプションがDBに正しく保存されていることを知っています。今度はそれをテンプレートで正しく出力するようにする必要があります。

次の質問: オプションはDBに個別に格納されているのですか、それとも配列として格納されていますか?

設定フォームのマークアップから、オプションは array として格納されているように見えるので、arrayに対して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

wp_optionsの下のoption_nameは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%です。

3
Chip Bennett

実際にはあなたの質問に答えることはできませんが、頭を上げるとテーマのオプションを構築するための本当に良いプラグインがいくつかあります。私にとっては、もう自分でやるための努力の価値はほとんどありません。

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

1
helgatheviking