I have a widget that shows posts based on selected category.
I can select category which I want to show its posts by selecting it from dropdown menu in the widget settings page.
What I want to do is show post_tags in that dropdown menu and show posts in my widget based on selected post_tag.
This is my widget code:
class colormag_highlighted_posts_widget extends WP_Widget {
function colormag_highlighted_posts_widget() {
$widget_ops = array( 'classname' => 'widget_highlighted_posts widget_featured_meta', 'description' => __( 'Display latest posts or posts of specific category', 'colormag') );
$control_ops = array( 'width' => 200, 'height' =>250 );
parent::WP_Widget( false,$name= __( 'TG: Highligted Posts', 'colormag' ),$widget_ops);
}
function form( $instance ) {
$tg_defaults['number'] = 4;
$tg_defaults['type'] = 'latest';
$tg_defaults['category'] = '';
$instance = wp_parse_args( (array) $instance, $tg_defaults );
$number = $instance['number'];
$type = $instance['type'];
$category = $instance['category'];
?>
<p>
<label for="<?php echo $this->get_field_id('number'); ?>"><?php _e( 'Number of posts to display:', 'colormag' ); ?></label>
<input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" />
</p>
<p><input type="radio" <?php checked($type, 'latest') ?> id="<?php echo $this->get_field_id( 'type' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>" value="latest"/><?php _e( 'Show latest Posts', 'colormag' );?><br />
<input type="radio" <?php checked($type,'category') ?> id="<?php echo $this->get_field_id( 'type' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>" value="category"/><?php _e( 'Show posts from a category', 'colormag' );?><br /></p>
<p>
<label for="<?php echo $this->get_field_id( 'category' ); ?>"><?php _e( 'Select category', 'colormag' ); ?>:</label>
<?php wp_dropdown_categories( array( 'show_option_none' =>' ','name' => $this->get_field_name( 'category' ), 'selected' => $category ) ); ?>
</p>
<?php
}
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance[ 'number' ] = absint( $new_instance[ 'number' ] );
$instance[ 'type' ] = $new_instance[ 'type' ];
$instance[ 'category' ] = $new_instance[ 'category' ];
return $instance;
}
function widget( $args, $instance ) {
extract( $args );
extract( $instance );
global $post;
$number = empty( $instance[ 'number' ] ) ? 4 : $instance[ 'number' ];
$type = isset( $instance[ 'type' ] ) ? $instance[ 'type' ] : 'latest' ;
$category = isset( $instance[ 'category' ] ) ? $instance[ 'category' ] : '';
if( $type == 'latest' ) {
$get_featured_posts = new WP_Query( array(
'posts_per_page' => $number,
'post_type' => 'post',
'ignore_sticky_posts' => true
) );
}
else {
$get_featured_posts = new WP_Query( array(
'posts_per_page' => $number,
'post_type' => 'post',
'category__in' => $category
) );
}
echo $before_widget;
?>
<div class="widget_highlighted_post_area">
<?php $featured = 'colormag-highlighted-post'; ?>
<?php
$i=1;
while( $get_featured_posts->have_posts() ):$get_featured_posts->the_post();
?>
<div class="single-article">
<?php
if( has_post_thumbnail() ) {
$image = '';
$title_attribute = get_the_title( $post->ID );
$image .= '<figure class="highlights-featured-image">';
$image .= '<a href="' . get_permalink() . '" title="'.the_title( '', '', false ).'">';
$image .= get_the_post_thumbnail( $post->ID, $featured, array( 'title' => esc_attr( $title_attribute ), 'alt' => esc_attr( $title_attribute ) ) ).'</a>';
$image .= '</figure>';
echo $image;
} else { ?>
<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
<img src="<?php echo get_template_directory_uri(); ?>/img/highlights-featured-image.png">
</a>
<?php }
?>
<div class="article-content">
<?php colormag_colored_category(); ?>
<h3 class="entry-title">
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute();?>"><?php the_title(); ?></a>
</h3>
<div class="below-entry-meta">
<?php
$time_string = '<time class="entry-date published" datetime="%1$s">%2$s</time>';
$time_string = sprintf( $time_string,
esc_attr( get_the_date( 'c' ) ),
esc_html( get_the_date() )
);
printf( __( '<span class="posted-on"><a href="%1$s" title="%2$s" rel="bookmark"><i class="fa fa-calendar-o"></i> %3$s</a></span>', 'colormag' ),
esc_url( get_permalink() ),
esc_attr( get_the_time() ),
$time_string
);
?>
<span class="byline"><span class="author vcard"><i class="fa fa-user"></i><a class="url fn n" href="<?php echo esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ); ?>" title="<?php echo get_the_author(); ?>"><?php echo esc_html( get_the_author() ); ?></a></span></span>
<span class="comments"><i class="fa fa-comment"></i><?php comments_popup_link( '0', '1', '%' );?></span>
</div>
</div>
</div>
<?php
$i++;
endwhile;
// Reset Post Data
wp_reset_query();
?>
</div>
<?php echo $after_widget;
}
}
First you can get post_tag dropdown by adding
to function wp_dropdown_categories.
then in WP_Query category__in must change to tag__in.
this is working code: