Instead of modifying the sidebar or templates itself, why not create a plugin with a widget that does just what you need. This way
-
you don’t hard code and keeps thing dynamic. This will also allow you to move the widget around at will
-
you keep your templates clean, simple and maintainable
-
do it the correct way. Stuff like widgets, registering custom post types and taxonomies and shortcodes should always be registered in a plugin and not inside a theme
I have written a very basic widget template a while ago which you can check out here. We can use this as a basis to create our custom widget. I will comment the parts where you an modify the output. You can also alter the widget as needed.
Lets look at the plugin (simply create a file in your plugins folder, add this code and activate the plugin)
NOTE: All code is untested and might be buggy. Also, you will need to have PHP 5.4+ installed for this to work
<?php
/*
Plugin Name: Blog Page Featured Image
Plugin URI: https://wordpress.stackexchange.com/q/219344/31545
Description: Displays the blog page's feaured image in the sidear
Version: 1.0.0
Author: Pieter Goosen
Author URI: https://wordpress.stackexchange.com/users/31545/pieter-goosen
License: GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
class Blog_Page_Featured_Image extends WP_Widget
{
public function __construct()
{
parent::__construct(
'widget_blog_page_featured_image',
_x( 'Blog Page Featured Image', 'Blog page featured image' ),
[ 'description' => __( 'Displays the featured image for the pge set as blog page.' ) ]
);
$this->alt_option_name="widget_blog_page_featured_image";
add_action( 'save_post', [$this, 'flush_widget_cache'] );
add_action( 'deleted_post', [$this, 'flush_widget_cache'] );
add_action( 'switch_theme', [$this, 'flush_widget_cache'] );
}
public function widget( $args, $instance )
{
$cache = [];
if ( ! $this->is_preview() ) {
$cache = wp_cache_get( 'widget_bpfi', 'widget' );
}
if ( ! is_array( $cache ) ) {
$cache = [];
}
if ( ! isset( $args['widget_id'] ) ) {
$args['widget_id'] = $this->id;
}
if ( isset( $cache[ $args['widget_id'] ] ) ) {
echo $cache[ $args['widget_id'] ];
return;
}
ob_start();
$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Blog Page Featured Image' );
/** This filter is documented in wp-includes/default-widgets.php */
$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
// ADD YOUR CUSTOM PHP CODE HERE FOR EXECUTION TO DISPLAY ON FRONT END
// First make sure this is the page set as blogpage
if ( 'page' === get_option('show_on_front')
&& is_home()
) { // We are on the blogpage
// Get the current page object
$page_object = $GLOBALS['wp_the_query']->get_queried_object();
// Make sure that the current page IS the one set as blogpage
if ( $page_object->ID === (int) get_option( 'page_for_posts' ) ) {
/**
* Now that we are sure we are on the posts page, lets get and display
* its featured image. We will also first make sure that we
* actually have one set
*/
if ( has_post_thumbnail( $page_object->ID ) )
echo get_the_post_thumbnail( $page_object->ID );
}
}
echo $args['after_widget'];
if ( ! $this->is_preview() ) {
$cache[ $args['widget_id'] ] = ob_get_flush();
wp_cache_set( 'widget_bpfi', $cache, 'widget' );
} else {
ob_end_flush();
}
}
public function update( $new_instance, $old_instance )
{
$instance = $old_instance;
$instance['title'] = strip_tags( $new_instance['title'] );
$this->flush_widget_cache();
$alloptions = wp_cache_get( 'alloptions', 'options' );
if ( isset($alloptions['widget_blog_page_featured_image']) )
delete_option('widget_blog_page_featured_image');
return $instance;
}
public function flush_widget_cache()
{
wp_cache_delete('widget_bpfi', 'widget');
}
public function form( $instance )
{
$title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
</p>
<?php
}
}
add_action( 'widgets_init', function ()
{
register_widget( 'Blog_Page_Featured_Image' );
});
What I also like to do is to always completely remove a widget when it is is totally out of context to avoid the sidebar from rendering a blank space when no other widgets are displayed
We can try the same approach as I have described here. You can just add this at the bottom of the plugin
add_filter( 'sidebars_widgets', function ( $sidebars_widgets )
{
// Return our filter when we are on admin screen
if ( is_admin() )
return $sidebars_widgets;
// Make sure we are not on the blog page, if we are, bail
if ( 'page' === get_option('show_on_front')
&& is_home()
&& $GLOBALS['wp_the_query']->get_queried_object_id() === (int) get_option( 'page_for_posts' )
)
return $sidebars_widgets;
/**
* Widget we need to target. This should be the name/id we used to register it
*
* EXAMPLE
* parent::__construct(
'widget_blog_page_featured_image',
_x( 'Blog Page Featured Image', 'Blog page featured image' ),
[ 'description' => __( 'Displays the featured image for the pge set as blog page.' ) ]
);
*
*/
$custom_widget="widget_blog_page_featured_image";
// See if our custom widget exists is any sidebar, if so, get the array index
foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) {
// Skip the wp_inactive_widgets set, we do not need them
if ( $sidebars_key == 'wp_inactive_widgets' )
continue;
// Only continue our operation if $sidebars_widget are not an empty array
if ( $sidebars_widget ) {
foreach ( $sidebars_widget as $k=>$v ) {
/**
* Look for our custom widget, if found, unset it from the $sidebars_widgets array
* @see stripos()
*/
if ( stripos( $v, $custom_widget ) !== false )
unset( $sidebars_widgets[$sidebars_key][$k] );
} // endforeach $sidebars_widget
} // endif $sidebars_widget
} // endforeach $sidebars_widgets
return $sidebars_widgets;
});
EDIT
The code above is now tested and working as expected