如何使用此自定义mysql查询将数据检索为Wp_query对象?

SELECT 
    IF (POSITION('Villa' IN p.post_title )>=1,
        SUBSTRING(p.post_title, 7), post_title) AS 'Title',
    p.post_title, 
    p.ID, 
    p.post_content
FROM wp_posts p INNER JOIN wp_term_relationships tr
 ON p.ID=tr.object_id where tr.term_taxonomy_id=4
    and p.post_status='publish' 
ORDER BY Title ASC;

I can run above query to get data with "wpdb" function like

$wpdb->get_results($query);

But I need the above results to be returned as a Wp_query object as I want to use functions like get_the_excerpt()

The orderby parameter accepts the post__in sorting value as a possible way to sort posts returned. With orderby set to post__in, the posts will be returned in the order they are entered into the post__in parameter.

The following code

 args = [
         'post__in' =>[3, 1, 2],
        'orderby' => 'post__in'
        ];

$q = new WP_Query( $args );

will return posts 1,2, and 3 in the following order

  3,1,2

Try this code,

 $args = array(
            'post_type' => $post_type,
            'posts_per_page' => -1,
            'post_status'=>'publish',
            'orderby'=>'title',
            'order'   => 'ASC',
            'tax_query' => array(
                array(
                    'taxonomy' => $taxonomy,
                    'field' => 'id',
                    'terms' => 4
                )
            )  
        );
        $query = new WP_Query($args);
        $query_posts = $query->posts;
        var_dump($query_posts);

You can take your WPDB results and use the post functions like this...

global $wpdb;
global $post;

$query = "SELECT 
    IF (POSITION('Villa' IN p.post_title )>=1,
        SUBSTRING(p.post_title, 7), post_title) AS 'Title',
    p.post_title, 
    p.ID, 
    p.post_content
FROM wp_posts p INNER JOIN wp_term_relationships tr
ON p.ID=tr.object_id where tr.term_taxonomy_id=4
    and p.post_status='publish' 
ORDER BY Title ASC;"

$result = $wpdb->get_results( $query );

foreach( $result as $post )
{
    setup_postdata( $post );
    echo "<div>" . get_the_excerpt() . "</div>";
}

Make sure you set the $post global.