我正在编写一个带有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
,而不是使用get_field_name
;这不是解决方案,只是我击中的一堵墙。
谢谢!
修改 我将问题缩小到小部件更新功能,这在使用foreach循环时似乎不起作用。 stackoverflow上另一个未解决的问题描述了类似的东西。 PHP - Wordpress - Plugin Widget Update Function - Update array values [Foreach Loop not Working]
这是我的代码(稍作修改),包括更新功能。
// 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;
}