如何在Wordpress中为空wp_query编写更有效的回退

I have a WooCommerce store where I want to display a featured image & heading of one of the following (in order):

  1. Featured Product
  2. If no featured product, then sticky post
  3. If no sticky post, then most recent post

But I also want to write efficient code. How do I simplify this and remove redundant PHP and HTML?

/* START FEATURED PRODUCT QUERY */
$args = array(
    'posts_per_page' => 1,
    'post_type' => 'product',
    'meta_query' => array(
         'key' => '_featured',
         'value' => 'yes'
         ),
$query = new WP_Query( $args );

if( $query->have_posts() ) {
   while( $query->have_posts() ) {
            $query->the_post(); ?>

            <a href="<?php the_permalink(); ?>" id="featured-blog-post">    
                <?php the_post_thumbnail('full');
             the_title('<h2>', '<span>&raquo;</span></h2>' );
             the_excerpt(); ?>
            </a> <?php
    } // end while
    wp_reset_postdata();        
} else {

/* START FALLBACK POST QUERY */
$args = array(
    'posts_per_page' => 1,
    'post__in' => get_option( 'sticky_posts'),
    'ignore_sticky_posts' => 1
    );

$query = new WP_Query( $args );

   while( $query->have_posts() ) {
            $query->the_post(); ?>

            <a href="<?php the_permalink(); ?>" id="featured-blog-post">    
                <?php the_post_thumbnail('full');
             the_title('<h2>', '<span>&raquo;</span></h2>' );
             the_excerpt(); ?>
            </a> <?php
    } // end while
    wp_reset_postdata();
}       

The second WP_Query has the exact same HTML output, just different $args

I’m writing a similar query and I’m not sure you can make the query much more efficient in Wordpress than you already have. The only thing I did differently was to make the output of the posts a function so that it calls the same code. This’ll make it easier to update.

Also since you’re only querying one meta field in the first query I switched to a simple custom field query.

// Function to output posts
function output_posts( $query ){

    while( $query->have_posts() ) {
        $query->the_post();

        echo '<a href="' . get_permalink() '" id="featured-blog-post">';    
            the_post_thumbnail( 'full' );
            the_title( '<h2>', '<span>&raquo;</span></h2>' );
            the_excerpt();
        echo '</a>';
    }

    wp_reset_postdata();    
}

// Featured query
$args = array(
    'posts_per_page' => 1,
    'post_type'      => 'product',
    'meta_key'       => '_featured',
    'meta_value'     => 'yes',
);

$featured = new WP_Query( $args );

// If featured has posts
if( $featured->have_posts() ) {
    // Output
    output_posts( $featured );    

// Else fallback    
} else {

    // Fallback query
    $args = array(
        'posts_per_page'      => 1,
        'post__in'            => get_option( 'sticky_posts'),
        'ignore_sticky_posts' => 1,
    );  

    $fallback = new WP_Query( $args );

    // If fallback has posts
    if ( $fallback->have_posts() ){
        // Output
        output_posts( $fallback );       

    }
}