web-dev-qa-db-ja.com

タブ付きの設定ページで設定を2回保存する

チュートリアルで管理者設定ページにタブ設定を表示しようとしましたが、設定保存通知を2回取得しています。

私はそれが異なる設定フィールドによるものだと思いますが、タブの選択に基づいてPHP条件を使用して1つのフォームのみを表示しています。そのため、1つのsettings_fields()を含むフォームは1つだけですが、保存時に2回保存された設定をどのように表示するかがわかります。わからない。どんな体もこれを助けることができます。

コード

    <div class="wrap">  

        <div id="icon-themes" class="icon32"></div>  
        <h2>Sandbox Theme Options</h2>  
        <?php settings_errors(); ?>  
        <?php $active_tab = isset( $_GET[ 'tab' ] ) ? $_GET[ 'tab' ] : 'd_options';  ?>
        <h2 class="nav-tab-wrapper">  
    <a href="?page=followshape&tab=d_options" class="nav-tab <?php echo $active_tab == 'd_options' ? 'nav-tab-active' : ''; ?>">Display</a>  
    <a href="?page=followshape&tab=s_options" class="nav-tab <?php echo $active_tab == 's_options' ? 'nav-tab-active' : ''; ?>">Shape</a> 
    <a href="?page=followshape&tab=Stat" class="nav-tab <?php echo $active_tab == 'Stat' ? 'nav-tab-active' : ''; ?>">Stat</a> 
</h2>



            <?php  if( $active_tab == 'd_options' ) { ?>
        <form method="post" action="options.php">  
            <?php
            settings_fields( 'shapet' );  
            ?>

            <div class="show_type">
            <input type="radio" name="shape" id="radio1" value="1"<?php checked(1,get_option('shape')); ?>/>
            <label for="radio1"><img src="<?php echo plugins_url(); ?>/slider/images/1.jpg"></label>

            <input type="radio" id="radio2" name="shape" value="2"<?php checked(2,get_option('shape')); ?> />
            <label for="radio2"><img src="<?php echo plugins_url(); ?>/slider/images/2.jpg"></label>

            <input type="radio" id="radio3" name="shape" value="3"<?php checked(3,get_option('shape')); ?> />
            <label for="radio3"><img src="<?php echo plugins_url(); ?>/slider/images/3.jpg"></label>

            <input type="radio" id="radio4" name="shape" value="4"<?php checked(4,get_option('shape')); ?> />
            <label for="radio4"><img src="<?php echo plugins_url(); ?>/slider/images/4.jpg"></label>

            <input type="radio" id="radio5" name="shape" value="5"<?php checked(5,get_option('shape')); ?> />
            <label for="radio5"><img src="<?php echo plugins_url(); ?>/slider/images/5.jpg"></label>
            <input type="text" name="sh_color" value="<?php echo get_option('sh_color'); ?>" class="ir" />
            </div>
            <input type="submit" name="submit" /> 
            </form>  
            <?php 
        } if($active_tab == 's_options') { ?>
           <form method="post" action="options.php">
               <?php
            settings_fields( 'social' );
            for($i=1;$i<=8;$i++){
           ?>
            <lable>Social Network<?php echo $i; ?> </lable><input type="text" name="sfsocial_net<?php echo $i; ?>" value="<?php echo get_option('sfsocial_net'.$i); ?>"/>
            <lable>Show </lable><input type="checkbox" name="sfsocial_net_show<?php echo $i; ?>" value="1"<?php checked(1,get_option('sfsocial_net_show'.$i)); ?> />
            <lable>Lable</lable><input type="text" name="sfsocial_lable<?php echo $i; ?>" value="<?php echo get_option('sfsocial_lable'.$i); ?>"/>
            <br>

            <?php  }
               ?>
             <input type="submit" name="submit" /> 
          </form> 

        <?php } if ($active_tab == 'Stat') { ?>
            <form method="post" action="options.php">
                <?php
            echo "graph";
            settings_fields('stat');?>
            <lable>facebook</lable><input type="text" name="facebookun" value="<?php echo get_option('facebookun'); ?>"/>
             <input type="submit" name="submit" /> 
            </form>
        <?php
        }?>    



    </div>

@ MrJustinのアドバイスから質問を投稿した後に試してみました

add_settings_sectionとは別にadd_settings_fieldregister_settingを使用する必要があることがわかった後、

別のチュートリアルで試したコードを次に示します。

function registering_settings(){
  register_setting( 'my-settings-group', 'my-setting' );
    add_settings_section( 'section-one', 'Section One', 'section_one_callback', 'my-plugin' );
    add_settings_field( 'field-one', 'Field One', 'field_one_callback', 'my-plugin', 'section-one' );
}
add_action('admin_init','registering_settings');

function callback_testing(){
    ?>
<div class="wrap">  

        <div id="icon-themes" class="icon32"></div>  
        <h2>Sandbox Theme Options</h2>  
        <?php settings_errors(); ?>  
        <?php $active_tab = isset( $_GET[ 'tab' ] ) ? $_GET[ 'tab' ] : 'd_options';  ?>
        <h2 class="nav-tab-wrapper">  
    <a href="?page=slug_testing&tab=d_options" class="nav-tab <?php echo $active_tab == 'd_options' ? 'nav-tab-active' : ''; ?>">Display Options</a>  
    <a href="?page=slug_testing&tab=s_options" class="nav-tab <?php echo $active_tab == 's_options' ? 'nav-tab-active' : ''; ?>">Social Options</a> 
    <a href="?page=slug_testing&tab=S" class="nav-tab <?php echo $active_tab == 'S' ? 'nav-tab-active' : ''; ?>">Statistics</a> 
    <a href="?page=slug_testing&tab=new" class="nav-tab <?php echo $active_tab == 'new' ? 'nav-tab-active' : ''; ?>">New</a> 
</h2>

        <?php  if ($active_tab == 'new') { ?>
            <form action="options.php" method="POST">
            <?php settings_fields( 'my-settings-group' ); ?>
            <?php do_settings_sections( 'my-plugin' ); ?>
            <?php submit_button(); ?>
        </form>

        <?php } ?>
         <?php  if ($active_tab == 'd_options') { ?>

        <?php } ?>
         <?php  if ($active_tab == 's_options') { ?>

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

    <?php
}

  function section_one_callback() {
    echo 'Some help text goes here.';
}
  function field_one_callback() {
    $setting = esc_attr( get_option( 'my-setting' ) );
    echo "<input type='text' name='my-setting' value='$setting' />";
}

これを試しても、設定が2回保存されます。しかし、sectionは1つだけで、settings_fieldsは1つだけで、合計で1つのフォームしかありません。変更を保存するときに2回保存された設定が表示される理由。

編集

  register_setting( 'my-plugin', 'my-setting' );
    add_settings_section( 'section-one', 'Section One', 'section_one_callback', 'my-plugin' );
    add_settings_field( 'field-one', 'Field One', 'field_one_callback', 'my-plugin', 'section-one' );


        <form method="post" action="options.php">  
<?php  if($active_tab == 'new') {
    settings_fields( 'my-plugin' );
    do_settings_sections( 'my-plugin' );
} else if($active_tab == 'd_options') { 
    // Do D_Options
} else if($active_tab == 's_options') {
    // Do S_Options
} 
submit_button();
?>  
</form>
1
rram

犯人は次のとおりです。

<?php settings_errors(); ?>

これは必要ではなく、2番目の「設定が保存されました」が生成されます。エラーがない場合の通知。

フォーマット用に編集されました。

従来とは異なる方法でオプションページを設定します。表示 このWP/StackExchange 正解、これが設定ページの設定方法です。これは問題なく機能します。 *注意:私の答えは正しいものです。

-編集-

これを試してください。実際の表示はまだ少しオフです。2回保存するべきではありません。実際の表示コンテンツにフォームをラップし、submit_buttonにコンテンツを配置します。

<form method="post" action="options.php">  
<?php  if($active_tab == 'new') {
    settings_fields( 'my-settings-group' );
    do_settings_sections( 'my-plugin' );
} else if($active_tab == 'd_options') { 
    // Do D_Options
} else if($active_tab == 's_options') {
    // Do S_Options
} 
submit_button();
?>  
</form>

-別の編集-

私はこれに気付きました:

    // Your Code(s)
register_setting( 'my-settings-group', 'my-setting' );

settings_fields( 'my-settings-group' );
do_settings_sections( 'my-plugin' );

    // Should Be 

register_setting('my-plugin', 'my-plugin');

settings_fields( 'my-plugin' );
do_settings_sections( 'my-plugin' );

Add_settings_section()の最後の部分は、オプショングループ自体です。したがって、「my-plugin」がグループになります。実際のオプションはadd_settings_field()の最初の部分です

意味:my-plugin ['field-one']がオプションです。

先に進み、これらの調整を行い、得られるものを確認してください。

その後、更新してポストバックします。

0
MrJustin