如何在WordPress自定义Widget中获取下拉实例值

时间:2020-03-20 作者:Prisma

我正在为我的自定义分类法和自定义帖子类型构建一个自定义小部件。基本上,它是一个显示自定义帖子类型(游戏)中最近帖子的小部件。我想给用户一个选项来选择一个术语,他想从中显示自定义帖子。我已放置了一个下拉列表,其中列出了可用于自定义帖子类型的所有自定义术语。但问题是,当用户从列表中选择一个术语时,下拉实例$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\' );

1 个回复
最合适的回答,由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\' ). 所以把它们改成\'\'.

这只是一张个人便条

相关推荐

在unctions.php文件中获取每个帖子的帖子术语‘wp_get_POST_Terms’

我使用了一个带有Ajax操作的表单来在提交时获取帖子信息。它很有魅力。然而,我使用了类别来将工作划分为不同的类别。其中之一就是品牌。在页面模板中,我使用的脚本有效,但在函数中使用时有效。php文件。它无法获得所需的结果。我认为这可能与何时触发对帖子的查询或如何设置add\\u操作有关。有人能帮我查一下ID为31的类别的名称吗?在函数中使用时。php。以下是我写的:if( $query->have_posts() ) : while( $query->have_posts() )