我正在为我的自定义分类法和自定义帖子类型构建一个自定义小部件。基本上,它是一个显示自定义帖子类型(游戏)中最近帖子的小部件。我想给用户一个选项来选择一个术语,他想从中显示自定义帖子。我已放置了一个下拉列表,其中列出了可用于自定义帖子类型的所有自定义术语。但问题是,当用户从列表中选择一个术语时,下拉实例$instance( cat_drop )
不返回任何值。我要做的是获取该值并进行自定义查询,以返回所选术语中的所有帖子。下面是我的代码。
function get_all_terms(){
$args = array(
\'taxonomy\' => \'gamecategory\',
\'hide_empty\' => 0,
\'orderby\' => \'name\',
\'order\' => \'ASC\',
\'show_count\' => 0,
\'use_desc_for_title\' => 0,
\'title_li\' => 0,
\'style\' => \'\',
\'echo\' => false,
);
$categories = wp_list_categories($args);
if ( $categories ) {
// printf( \'<div class="col">%s</div>\', $categories );
}
return $categories;
}
/**
* Adds Latest Games widget.
*/
class latest_games_widget extends WP_Widget {
/**
* Register widget with WordPress.
*/
function __construct() {
parent::__construct(
\'latest_games_widget\', // Base ID
esc_html__( \'Latest Games\', \'prisma\' ), // Name
array( \'description\' => esc_html__( \'Most Recent Games\', \'text_domain\' ), ) // Args
);
}
/**
* Front-end display of widget.
*/
public function widget( $args, $instance ) {
echo $args[\'before_widget\'];
if ( ! empty( $instance[\'title\'] ) ) {
echo $args[\'before_title\'] . apply_filters( \'widget_title\', $instance[\'title\'] ) . $args[\'after_title\'];
}
//Widget Content
$selected_cat = $instance[\'cat_drop\'];
$args = array(\'post_type\' => \'game\', \'gamecategory\' =>$selected_cat);
$loop = new WP_Query($args);
if($loop->have_posts( )):
while($loop->have_posts()): $loop->the_post();?>
<div class="col-md-3 game-card-outer">
<div class="game-card">
<?php if (has_post_thumbnail()): ?>
<a href="<?php the_permalink();?>"><?php the_post_thumbnail(\'small\', array(\'class\' => \'aligncenter\')); ?></a>
<?php endif;?>
<a class="latest_games_widget_post_title" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</div>
</div>
<?php endwhile;
endif;
//After Widget part
echo $args[\'after_widget\'];
}
/**
* Back-end widget form.
*
* @see WP_Widget::form()
*
* @param array $instance Previously saved values from database.
*/
public function form( $instance ) {
$title = ! empty( $instance[\'title\'] ) ? $instance[\'title\'] : esc_html__( \'\', \'prisma\' );
$cat_title = ! empty( $instance[\'cat_title\'] ) ? $instance[\'cat_title\'] : esc_html__( \'\', \'prisma\' );
?>
<select name="" id="<?php echo ( $this->get_field_id( \'cat_drop\' ) ); ?>">
<?php $terms = get_terms([\'taxonomy\' => \'gamecategory\',\'hide_empty\' => false,]);foreach($terms as $item){?>
<option value="<?php echo $item->name;?>"><?php echo $item->name; ?></option>
<?php }?>
</select>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( \'cat_title\' ) ); ?>"><?php esc_attr_e( \'Game category to Display:\', \'prisma\' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( \'cat_title\' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( \'cat_title\' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( \'title\' ) ); ?>"><?php esc_attr_e( \'Widget Title:\', \'prisma\' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( \'title\' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( \'title\' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
</p>
<?php
}
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance[\'title\'] = ( ! empty( $new_instance[\'title\'] ) ) ? sanitize_text_field( $new_instance[\'title\'] ) : \'\';
$instance[\'cat_title\'] = ( ! empty( $new_instance[\'cat_title\'] ) ) ? sanitize_text_field( $new_instance[\'cat_title\'] ) : \'\';
$instance[ \'cat_drop\' ] = ( !empty( $new_instance[ \'cat_drop\' ] ) ? strip_tags( $new_instance[ \'cat_drop\' ] ) : esc_html__(\'\',\'prisma\') );
return $instance;
}
} // class Foo_Widget
// register Foo_Widget widget
function register_foo_widget() {
register_widget( \'latest_games_widget\' );
}
add_action( \'widgets_init\', \'register_foo_widget\' );
最合适的回答,由SO网友:Sally CJ 整理而成
这个cat_drop
设置为空,因为您的下拉菜单或select
字段没有正确的name
值,因此PHP没有收到所选的选项/值。所以要解决这个问题,只需添加适当的name
对的值select
字段:
<!-- Wrapped for brevity. -->
<select
name="<?php echo $this->get_field_name( \'cat_drop\' ); ?>"
id="<?php echo $this->get_field_id( \'cat_drop\' ); ?>"
>
但是,还有
other issues in your code:
中的cat_drop
下拉菜单中,选项应为术语“slug”,但您当前将其设置为术语“name”。因此,请务必使用术语slug:
<!-- Note the $item->slug -->
<option value="<?php echo $item->slug;?>"><?php echo esc_html( $item->name ); ?></option>
在小部件的显示回调中(
widget()
), 您正在覆盖
$args
执行此操作时变量
$args = array(\'post_type\' => \'game\', \'gamecategory\' =>$selected_cat);
这将导致一个带有
echo $args[\'after_widget\'];
在函数末尾,因为
$args[\'after_widget\']
现在未定义。当它未定义时,widget容器将不会关闭,这可能会导致布局问题,尽管浏览器基本上是“智能”的,并且会自动关闭容器。
所以您应该重命名$args
, 也许是你用的那个WP_Query
.
使用esc_html__()
在空字符串上没有意义:esc_html__( \'\', \'prisma\' )
. 所以把它们改成\'\'
.
这只是一张个人便条你能改进一下你的代码格式吗?E、 g.去掉那些不必要的空行,并使用制表符进行缩进。因为一个好的代码不仅可以工作,而且干净,因为其他开发人员很容易维护或使用代码。:)