WordPress

wp query – Obraz wewnątrz treści jest zastępowany wyróżnionym obrazem z mojego starszego postu

  • 7 czerwca, 2023
  • 4 min read
wp query – Obraz wewnątrz treści jest zastępowany wyróżnionym obrazem z mojego starszego postu


Próbuję utworzyć popularny widżet postów i wyświetlać obrazy za pomocą tej funkcji:

function vp_get_thumb_url($post, $text, $size){

        $imageurl="";

// 1) FEATURED IMAGE
        // Check to see which image is set as "Featured Image"
        $featuredimg = get_post_thumbnail_id($post->ID);
        // Get source for featured image
        $img_src = wp_get_attachment_image_src($featuredimg, $size);
        // Set $imageurl to Featured Image
        $imageurl=$img_src[0];

// 2) 1ST ATTACHED IMAGE IMAGE
        // If there is no "Featured Image" set, move on and get the first image attached to the post
        if (!$imageurl) {
                // Extract the thumbnail from the first attached imaged
                $allimages =&get_children('post_type=attachment&post_mime_type=image&post_parent=" . $post->ID );

                foreach ($allimages as $img){
                        $img_src = wp_get_attachment_image_src($img->ID, $size);
                        break;
                }
                // Set $imageurl to first attached image
                $imageurl=$img_src[0];
        }

// 3) 1ST IMAGE URL IN POST
        // If there is no image attached to the post, look for anything that looks like an image and get that
        if (!$imageurl) {
                preg_match("/<\s*img [^\>]*src\s*=\s*[\""\']?([^\""\'>]*)/i' ,  $text, $matches);
                $imageurl=$matches[1];
        }

// 4) YOUTUBE SCREENSHOT
        // If there's no image attached or inserted in the post, look for a YouTube video
        if (!$imageurl){
                // look for traditional youtube.com url from address bar
                preg_match("/([a-zA-Z0-9\-\_]+\.|)youtube\.com\/watch(\?v\=|\/v\/)([a-zA-Z0-9\-\_]{11})([^<\s]*)/", $text, $matches2);
                $youtubeurl = $matches2[0];
                $videokey = $matches2[3];
        if (!$youtubeurl) {
                // look for youtu.be 'embed' url
                preg_match("/([a-zA-Z0-9\-\_]+\.|)youtu\.be\/([a-zA-Z0-9\-\_]{11})([^<\s]*)/", $text, $matches2);
                $youtubeurl = $matches2[0];
                $videokey = $matches2[2];
        }
        if ($youtubeurl)
            $videores = array ('maxresdefault','sddefault','mqdefault','hqdefault','default');
                for ($x = 0; $x < sizeof($videores); $x++) {
                    $imageurl = "http://i.ytimg.com/vi/{$videokey}/$videores[$x].jpg";
                    if (get_headers($imageurl)[0] == 'HTTP/1.0 200 OK') {
                        break;
                    }
                }
        }
        if (!$imageurl) {
        $imageurl = get_template_directory_uri() . '/placeholder.jpg';
        }

        // Spit out the image path
        return $imageurl;
}

Kod widżetu:

class my_widget extends WP_Widget {

public function __construct() {
    $widget_ops = array(
        'classname'                   => 'mywidget-popular',
        'description'                 => __( 'Your site&#8217;s most popular Posts.' ),
        'customize_selective_refresh' => true,
        'show_instance_in_rest'       => true,
    );
    parent::__construct( 'mywidget-popular', __( 'Popular Posts' ), $widget_ops );
    $this->alt_option_name="mywidget-popular";
}

public function widget( $args, $instance ) {
    if ( ! isset( $args['widget_id'] ) ) {
        $args['widget_id'] = $this->id;
    }

    $title = apply_filters( 'widget_title', $instance['title'] );
    $number = apply_filters('widget_number', $instance['number']);
    // Post settings
    $thumb = $instance[ 'thumb' ] ? 'true' : 'false';

    echo $args['before_widget'];

    if ( ! empty( $title ) )
        echo $args['before_title'] . $title . $args['after_title'];
    ?>

    <ul>
        <?php

        $top_posts = new WP_Query('posts_per_page=".$number."&meta_key=post_views_count&orderby=meta_value_num&order=DESC');

        if ($top_posts->have_posts()) : while ($top_posts->have_posts()) : $top_posts->the_post();?>

            <li>
                <?php if( 'on' == $instance[ 'thumb' ] ) : ?>
                    <div class="popular-thumb"><a href="<?php the_permalink(); ?>"><div style="background-image: url(<?php echo vp_get_thumb_url($post, $post->post_content, 'full'); ?>)"></div></a></div>
                <?php endif; ?>
                <h6><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h6>
            </li>
        <?php

            endwhile; 

             wp_reset_postdata();

            endif;
            ?>
           </ul>
           <?php
           echo $args['after_widget'];
}

public function update( $new_instance, $old_instance ) {
    return $new_instance;
}

public function form( $instance ) {
    $defaults = array( 'title' => __( 'Popular Posts' ), 'number' => 3, 'thumb' => true );
    $instance = wp_parse_args( ( array ) $instance, $defaults );

    include( plugin_dir_path(__FILE__) . '/views/form.php' );
}
}

// Register and load the widget
function mywidget_load_widget() {
    register_widget( 'my_widget' );
}
add_action( 'widgets_init', 'mywidget_load_widget' );

Problem polega na tym, że nie pokazuje aktualnego obrazu zawartości, jeśli nie ma dostępnego wyróżnionego obrazu, ale pokazuje wyróżniony obraz poprzedniego posta. Działa bez problemów, jeśli dodaję wyróżniony obraz, ale jeśli go nie ma, pokaże najnowszy obraz z mojej biblioteki.

Warto przeczytać!  Wygeneruj tytuł posta i bezpośredni link z niestandardowego pola i daty postu

PS. Wygląda na to że global $post zanim $top_posts = new WP_Query rozwiązuje problem, ale szukam innego rozwiązania. Pomoc?


Źródło