Я пытаюсь создать систему, которая извлекает почту из двух типов сообщений, и я хочу отобразить порядок сообщений по типу сообщения. Я пытаюсь сначала показать сообщения из одного типа сообщения, а затем другого типа сообщения, но в запросе, который я использовал, все это смешивается. Может ли кто-нибудь предложить хорошее решение для этого. Вот мой код.
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1; $args = array( 'post_type' => array('review','directory'), 'orderby' => 'name', 'order' => 'ASC', 'posts_per_page' => '4', 'paged' => $paged , 'tax_query' => array( array( 'taxonomy' => 'Reviews', 'field' => 'id', 'terms' => $cat_id ), ), ); query_posts($args); if (have_posts()) : while (have_posts()) : the_post(); $product_terms = wp_get_post_terms(get_the_ID(), 'Reviews', array("fields" => "all", "order" => "DESC")); $postype=get_post_type( get_the_ID() ); if($postype=='review') { ?> <div class="review-post"> <a href="http://<?php the_permalink(); ?>" target="_blank"><h3><?php the_title(); ?></h3></a> <div class="review-cat-new"> <?php echo get_the_term_list( $post->ID, 'Reviews', 'Category: ', ', ', '' ); ?> </div> <?php if(get_field('see_it')) $seeit_text= get_field('see_it'); if(get_field('skip_it')) $skipit_text= get_field('skip_it'); ?> <div class="see-skip"> <p class="see-it"><span>See it:</span> <?php echo $seeit_text; ?> </p> <p class="skip-it"><span>Skip it:</span> <?php echo $skipit_text; ?> </p> </div> <?php echo custom_field_excerpt(); ?> </div> <?php } else { ?> <div class="review-post"> <a href="h<?php the_permalink(); ?>" target="_blank"><h3><?php the_title(); ?></h3></a> <div class="review-cat-new"> <?php echo get_the_term_list( get_the_ID(), 'Reviews', 'Category: ', ', ', '' ); ?> </div> <?php echo the_field('enter_content_direc'); ?> <?php if(get_field('enter_textdirec')) $text= get_field('enter_textdirec'); if(get_field('enter_linkdirec')) $textlink= get_field('enter_linkdirec'); ?> <div class="see-skip"> <p class="see-it direc"><span><a target="_blank" style="color:#5D6D71; text-transform: lowercase;" href="<?php echo $textlink;?>"><?php echo $textlink;?> </a></span> </p> </div> </div> <?php } endwhile; echo '<div class="paging">'; wp_pagenavi(); echo '</div>'; endif;
Итак, есть ли способ, чтобы я мог сначала просмотреть рефералы по почте, а затем каталог?
Наконец, я получил решение, и это можно сделать с помощью фильтра.
Решение выглядит так.
add_filter( 'posts_request' , 'modify_request' ); function modify_request( $query) { global $wpdb; if(strstr($query,"post_type IN ('review', 'directory')")){ $where = str_replace("ORDER BY {$wpdb->posts}.post_date","ORDER BY {$wpdb->posts}.post_type",$query); } return $where; }
Заказ на типы сообщений с заказным типом почтового типа:
add_filter('pre_get_posts', function ($query) { if ($query->is_search && !is_admin()) : $query->set('post_type', [ 'cpt-1', 'cpt-2', 'post', 'cpt-3']); endif; return $query; }); add_filter('posts_orderby', function ( $order ) { if ( ! is_admin() ) : if ( is_search() && is_main_query() ) : global $wpdb; $order = "FIELD( post_type, 'cpt-1', 'cpt-2', 'post' ), {$wpdb->posts}.post_modified DESC"; endif; // Disable this filter for future queries! remove_filter( current_filter(), __FUNCTION__); endif; return $order; });
Первое решение, которое приходит мне на ум, – это получать сообщения только для первой категории. Сбросьте запрос ( wp_reset_query()
) и получите их снова для второй категории. Конечно, вам нужно удвоить свой код, но я не вижу другого решения – это WordPress – вы очень ограничены.
Второе решение – запросить базу данных прямо следующим образом:
$result = mysql_query('SELECT * FROM `wp_posts` WHERE post_type = "page" OR post_type = "post" ORDER BY post_type ASC , post_date DESC '); $posts = array(); if($result) { while ($row = mysql_fetch_assoc($result)) { $posts[] = $row; } } mysql_free_result($result); echo('<pre>'); var_dump($posts); echo('</pre>'); die();
-$result = mysql_query('SELECT * FROM `wp_posts` WHERE post_type = "page" OR post_type = "post" ORDER BY post_type ASC , post_date DESC '); $posts = array(); if($result) { while ($row = mysql_fetch_assoc($result)) { $posts[] = $row; } } mysql_free_result($result); echo('<pre>'); var_dump($posts); echo('</pre>'); die();
Обратите внимание, что я использовал типы post
и page
поскольку они являются стандартными и существуют в моей установке WP. Но вы можете использовать разные. Вы можете играть с этим запросом столько, сколько хотите.