• I want to make a custom widget to short a few posts (with their featured images).

    I am starting with some code below from WpBeginner. I am working with the snippet immediately below to create the posts. When I insert the get_recent_posts snippet, I keep breaking the site. This is, no doubt, a result of a lack of my understanding of PHP.

    So, where would the below snippet go in my widget?

    <ul id="slider-id" class="slider-class">
        <?php
        $recent_posts = wp_get_recent_posts(array(
            'numberposts' => 4, // Number of recent posts thumbnails to display
            'post_status' => 'publish' // Show only the published posts
        ));
        foreach($recent_posts as $post) : ?>
            <li>
                <a href="<?php echo get_permalink($post['ID']) ?>">
                    <?php echo get_the_post_thumbnail($post['ID'], 'full'); ?>
                    //Assuming that the slider support captions 
                    <p class="slider-caption-class"><?php echo $post['post_title'] ?></p>
                </a>
            </li>
        <?php endforeach; wp_reset_query(); ?>
    </ul>
    // Creating the widget 
    class wpb_widget extends WP_Widget {
      
    function __construct() {
    parent::__construct(
      
    // Base ID of your widget
    'wpb_widget', 
      
    // Widget name will appear in UI
    __('WPBeginner Widget', 'wpb_widget_domain'), 
      
    // Widget description
    array( 'description' => __( 'Sample widget based on WPBeginner Tutorial', 'wpb_widget_domain' ), ) 
    );
    }
      
    // Creating widget front-end
      
    public function widget( $args, $instance ) {
    $title = apply_filters( 'widget_title', $instance['title'] );
      
    // before and after widget arguments are defined by themes
    echo $args['before_widget'];
    if ( ! empty( $title ) )
    echo $args['before_title'] . $title . $args['after_title'];
      
    // This is where you run the code and display the output
    echo __( 'Hello, World!', 'wpb_widget_domain' );
    echo $args['after_widget'];
    }
              
    // Widget Backend 
    public function form( $instance ) {
    if ( isset( $instance[ 'title' ] ) ) {
    $title = $instance[ 'title' ];
    }
    else {
    $title = __( 'New title', 'wpb_widget_domain' );
    }
    // Widget admin form
    ?>
    <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 esc_attr( $title ); ?>" />
    </p>
    <?php 
    }
          
    // Updating widget replacing old instances with new
    public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
    return $instance;
    }
     
    // Class wpb_widget ends here
    } 
     
     
    // Register and load the widget
    function wpb_load_widget() {
        register_widget( 'wpb_widget' );
    }
    add_action( 'widgets_init', 'wpb_load_widget' );
    • This topic was modified 5 years, 2 months ago by oguruma.
Viewing 3 replies - 1 through 3 (of 3 total)
  • Your snippet contains HTML and PHP, which is fine, but you can’t simply drop it into the middle of PHP. You would need to close the PHP tag before the HTML, and open it again at the end, to continue in PHP.

    Also, the $post variable is a WP global variable, and although you didn’t declare it global (so you aren’t stomping on the WP variable), it’s best practice to not use that name so that you don’t accidentally stomp it.
    The wp_reset_query call is the wrong one to use. See https://developer.wordpress.org/reference/functions/wp_reset_query/
    The exact same code is listed in a User Note on the wp_get_recent_posts page, but it is not good code. The wp_get_recent_posts function calls get_posts and you get an array of posts. This does not affect the main loop, so you don’t have to reset it. If you actually use the setup_postdata function to access other parts of each post, you would then need to call wp_reset_postdata at the end.

    Thread Starter oguruma

    (@oguruma)

    So, I should change $post to $some_posts or something else, but what else is wrong with the code? (I stole the code from the get_recent_posts developer guide).

    Reread my reply (first part), where I explained the likely problem, and the second part where I tried to explain the problem with that code. I guess it might not be obvious, but there should not be a call to wp_reset_query, and use wp_reset_postdata only if you also use setup_postdata first.

Viewing 3 replies - 1 through 3 (of 3 total)

The topic ‘Create Recent Posts Widget’ is closed to new replies.