1

HTMLチェックボックスの設定フォームを使用してWordPressウィジェットプラグインを作成しています。各チェックボックスは異なる に対応していますpost_type。これは私のコードです:

function form($instance) {
   $defaults   = array( 'num_posts' => 5 );
   $instance   = wp_parse_args( (array) $instance, $defaults );
   $num_posts  = $instance['num_posts'];
   $post_types = get_post_types();
   $instance['post_types'] = $post_types;
   ?>

<p>Number of posts to show: <input class="widefat" name="<?php echo $this->get_field_name( 'num_posts' ); ?>" type="number" value="<?php echo esc_attr( $num_posts ); ?>" /></p>
    <p>Filter by Post Type: <ul>
    <?php foreach ($post_types as $post_type) { ?>
        <li><input name="<?php echo $post_type; ?>" type="checkbox" <?php checked( $post_types, 'on' ); ?> /><label for="<?php echo $post_type; ?>" /><?php echo $post_type; ?></label></li>
    <?php
    } ?>
    </ul></p>

$instance私の質問は、ループ内のチェックボックスの動的な名前をどのように生成するのですか? のようなことができるはずだと思いますが$this->get_field_name( 'myname' );、それを動的にする方法は?

注:上記のコード サンプルでは、​​ ;post_typeを使用する代わりに、 name プロパティに対して を出力するだけです。get_field_nameこれは解決策ではなく、私がぶつかった壁です。

ありがとう!

編集: 問題をウィジェットの更新機能に絞り込みました。これは、foreach ループを使用すると機能しないようです。stackoverflow に関する別の未回答の問題は、同様のことを説明しています。PHP - Wordpress - プラグインのウィジェット更新機能 - 配列の値を更新する【Foreachループが動かない】

update 関数を含む私のコード (少し修正) を次に示します。

    // build the widget settings form
function form( $instance ) {
    $defaults   = array( 'num_posts' => 5 );
    $instance   = wp_parse_args( (array) $instance, $defaults );
    $num_posts  = $instance['num_posts'];

    foreach ( get_post_types() as $post_type ) {
        $post_types_array[$post_type] = $post_type;
    }

    $instance['post_types'] = $post_types_array;
    $post_types = $instance['post_types'];

    echo '<pre>';
    print_r($instance);
    echo '</pre>';
    ?>

        <p>Number of posts to show: <input class="widefat" name="<?php echo $this->get_field_name( 'num_posts' ); ?>" type="number" value="<?php echo esc_attr( $num_posts ); ?>" /></p>
        <p>Filter by Post Type: <ul>
        <?php foreach ( $post_types as $post_type ) { ?>
            <li><input name="<?php echo $this->get_field_name( $post_type ); ?>" type="checkbox" <?php checked( $this->get_field_name( $post_type ) ); ?> /><label for="<?php echo $this->get_field_name( $post_type ); ?>" /><?php echo $post_type; ?></label></li>
        <?php
       } ?>
        </ul></p>

    <?php
}

// save the widget settings
function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    $instance['num_posts'] = strip_tags( $new_instance['num_posts'] );

    foreach ( $instance['post_types'] as $post_type ) {
        $instance['post_types'][$post_type] = strip_tags( $new_instance['post_types'][$post_type] );
    }

    return $instance;
}
4

0 に答える 0