defaults = array(
'title' => '',
'posts_cat' => '',
'posts_num' => '',
'posts_offset' => 0,
'orderby' => '',
'order' => '',
'exclude_displayed' => 0,
'exclude_sticky' => 0,
'show_image' => 0,
'image_alignment' => '',
'image_size' => '',
'show_gravatar' => 0,
'gravatar_alignment' => '',
'gravatar_size' => '',
'show_title' => 0,
'show_byline' => 0,
'post_info' => '[post_date] ' . __( 'By', 'genesis' ) . ' [post_author_posts_link] [post_comments]',
'show_content' => 'excerpt',
'content_limit' => '',
'more_text' => __( '[Read More...]', 'genesis' ),
'extra_num' => '',
'extra_title' => '',
'more_from_category' => '',
'more_from_category_text' => __( 'More Posts from this Category', 'genesis' ),
);
$widget_ops = array(
'classname' => 'featured-content featuredpost',
'description' => __( 'Displays featured posts with thumbnails', 'genesis' ),
);
$control_ops = array(
'id_base' => 'featured-post',
'width' => 505,
'height' => 350,
);
parent::__construct( 'featured-post', __( 'Genesis - Featured Posts', 'genesis' ), $widget_ops, $control_ops );
}
/**
* Echo the widget content.
*
* @since 1.0.0
*
* @global WP_Query $wp_query Query object.
* @global array $_genesis_displayed_ids Array of displayed post IDs.
* @global int $more
*
* @param array $args Display arguments including `before_title`, `after_title`,
* `before_widget`, and `after_widget`.
* @param array $instance The settings for the particular instance of the widget.
*/
public function widget( $args, $instance ) {
global $wp_query, $_genesis_displayed_ids;
// Merge with defaults.
$instance = wp_parse_args( (array) $instance, $this->defaults );
echo $args['before_widget'];
// Set up the author bio.
if ( ! empty( $instance['title'] ) ) {
echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base ) . $args['after_title']; // WPCS: prefix ok.
}
$query_args = array(
'post_type' => 'post',
'cat' => $instance['posts_cat'],
'showposts' => $instance['posts_num'],
'offset' => $instance['posts_offset'],
'orderby' => $instance['orderby'],
'order' => $instance['order'],
'ignore_sticky_posts' => $instance['exclude_sticky'],
);
// Exclude displayed IDs from this loop?
if ( $instance['exclude_displayed'] ) {
$query_args['post__not_in'] = (array) $_genesis_displayed_ids;
}
$wp_query = new WP_Query( $query_args );
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
$_genesis_displayed_ids[] = get_the_ID();
genesis_markup( array(
'open' => '',
'context' => 'entry',
'params' => array(
'is_widget' => true,
),
) );
$image = genesis_get_image( array(
'format' => 'html',
'size' => $instance['image_size'],
'context' => 'featured-post-widget',
'attr' => genesis_parse_attr( 'entry-image-widget', array(
'alt' => get_the_title(),
) ),
) );
if ( $image && $instance['show_image'] ) {
$role = empty( $instance['show_title'] ) ? '' : 'aria-hidden="true"';
printf( '%s ', get_permalink(), esc_attr( $instance['image_alignment'] ), $role, wp_make_content_images_responsive( $image ) );
}
if ( ! empty( $instance['show_gravatar'] ) ) {
echo '';
echo get_avatar( get_the_author_meta( 'ID' ), $instance['gravatar_size'] );
echo ' ';
}
if ( $instance['show_title'] || $instance['show_byline'] ) {
$header = '';
if ( ! empty( $instance['show_title'] ) ) {
$title = get_the_title() ? get_the_title() : __( '(no title)', 'genesis' );
/**
* Filter the featured post widget title.
*
* @since 2.2.0
*
* @param string $title Featured post title.
* @param array $instance {
* Widget settings for this instance.
*
* @type string $title Widget title.
* @type int $posts_cat ID of the post category.
* @type int $posts_num Number of posts to show.
* @type int $posts_offset Number of posts to skip when
* retrieving.
* @type string $orderby Field to order posts by.
* @type string $order ASC fr ascending order, DESC for
* descending order of posts.
* @type bool $exclude_displayed True if posts shown in main output
* should be excluded from this widget
* output.
* @type bool $show_image True if featured image should be
* shown, false otherwise.
* @type string $image_alignment Image alignment: `alignnone`,
* `alignleft`, `aligncenter` or `alignright`.
* @type string $image_size Name of the image size.
* @type bool $show_gravatar True if author avatar should be
* shown, false otherwise.
* @type string $gravatar_alignment Author avatar alignment: `alignnone`,
* `alignleft` or `aligncenter`.
* @type int $gravatar_size Dimension of the author avatar.
* @type bool $show_title True if featured page title should
* be shown, false otherwise.
* @type bool $show_byline True if post info should be shown,
* false otherwise.
* @type string $post_info Post info contents to show.
* @type bool $show_content True if featured page content
* should be shown, false otherwise.
* @type int $content_limit Amount of content to show, in
* characters.
* @type int $more_text Text to use for More link.
* @type int $extra_num Number of extra post titles to show.
* @type string $extra_title Heading for extra posts.
* @type bool $more_from_category True if showing category archive
* link, false otherwise.
* @type string $more_from_category_text Category archive link text.
* }
* @param array $args {
* Widget display arguments.
*
* @type string $before_widget Markup or content to display before the widget.
* @type string $before_title Markup or content to display before the widget title.
* @type string $after_title Markup or content to display after the widget title.
* @type string $after_widget Markup or content to display after the widget.
* }
*/
$title = apply_filters( 'genesis_featured_post_title', $title, $instance, $args );
$heading = genesis_a11y( 'headings' ) ? 'h4' : 'h2';
$header .= genesis_markup( array(
'open' => "<{$heading} %s>",
'close' => "{$heading}>",
'context' => 'entry-title',
'content' => sprintf( '%s ', get_permalink(), $title ),
'params' => array(
'is_widget' => true,
'wrap' => $heading,
),
'echo' => false,
) );
}
if ( ! empty( $instance['show_byline'] ) && ! empty( $instance['post_info'] ) ) {
$header .= genesis_markup( array(
'open' => '',
'close' => '
',
'context' => 'entry-meta',
'content' => genesis_strip_p_tags( do_shortcode( $instance['post_info'] ) ),
'params' => array(
'is_widget' => true,
),
'echo' => false,
) );
}
genesis_markup( array(
'open' => '',
'context' => 'entry-header',
'params' => array(
'is_widget' => true,
),
'content' => $header,
) );
}
if ( ! empty( $instance['show_content'] ) ) {
genesis_markup( array(
'open' => '',
'context' => 'entry-content',
'params' => array(
'is_widget' => true,
),
) );
if ( 'excerpt' == $instance['show_content'] ) {
the_excerpt();
} elseif ( 'content-limit' == $instance['show_content'] ) {
the_content_limit( (int) $instance['content_limit'], genesis_a11y_more_link( esc_html( $instance['more_text'] ) ) );
} else {
global $more;
$orig_more = $more;
$more = 0;
the_content( genesis_a11y_more_link( esc_html( $instance['more_text'] ) ) );
$more = $orig_more;
}
genesis_markup( array(
'close' => '
',
'context' => 'entry-content',
'params' => array(
'is_widget' => true,
),
) );
}
genesis_markup( array(
'close' => ' ',
'context' => 'entry',
'params' => array(
'is_widget' => true,
),
) );
}
}
// Restore original query.
wp_reset_query();
// The EXTRA Posts (list).
if ( ! empty( $instance['extra_num'] ) ) {
if ( ! empty( $instance['extra_title'] ) ) {
echo $args['before_title'] . '' . esc_html( $instance['extra_title'] ) . ' ' . $args['after_title'];
}
$offset = (int) $instance['posts_num'] + (int) $instance['posts_offset'];
$query_args = array(
'cat' => $instance['posts_cat'],
'showposts' => $instance['extra_num'],
'offset' => $offset,
);
$wp_query = new WP_Query( $query_args );
$listitems = '';
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
$_genesis_displayed_ids[] = get_the_ID();
$listitems .= sprintf( '
%s ', get_permalink(), get_the_title() );
}
if ( mb_strlen( $listitems ) > 0 ) {
printf( '', $listitems );
}
}
// Restore original query.
wp_reset_query();
}
if ( ! empty( $instance['more_from_category'] ) && ! empty( $instance['posts_cat'] ) ) {
printf(
'%3$s
',
esc_url( get_category_link( $instance['posts_cat'] ) ),
esc_attr( get_cat_name( $instance['posts_cat'] ) ),
esc_html( $instance['more_from_category_text'] )
);
}
echo $args['after_widget'];
}
/**
* Update a particular instance.
*
* This function should check that $new_instance is set correctly.
* The newly calculated value of $instance should be returned.
* If "false" is returned, the instance won't be saved/updated.
*
* @since 1.0.0
*
* @param array $new_instance New settings for this instance as input by the user via `form()`.
* @param array $old_instance Old settings for this instance.
* @return array Settings to save or bool false to cancel saving.
*/
public function update( $new_instance, $old_instance ) {
$post_num = (int) $new_instance['posts_num'];
$new_instance['posts_num'] = $post_num > 0 && $post_num < 100 ? $post_num : 1;
$new_instance['title'] = strip_tags( $new_instance['title'] );
$new_instance['more_text'] = strip_tags( $new_instance['more_text'] );
$new_instance['post_info'] = wp_kses_post( $new_instance['post_info'] );
return $new_instance;
}
/**
* Echo the settings update form.
*
* @since 1.0.0
*
* @param array $instance Current settings.
* @return void
*/
public function form( $instance ) {
// Merge with defaults.
$instance = wp_parse_args( (array) $instance, $this->defaults );
?>
: