Как фильтровать получение предыдущей функции post по метазначению DESC и по дате DESC?

В моем цикле отображаются объявленные сообщения, а затем сообщения в обратном хронологическом порядке.

Однако, когда я использую <?php echo get_previous_post(); ?> <?php echo get_previous_post(); ?> он захватывает сообщения в обратном хронологическом порядке.

Как добавить фильтр к предыдущей функции почты, подобной этому, но вместо этого фильтровать таким массивом: 'orderby' => array( 'meta_value' => 'DESC', 'date' => 'DESC') ?


Код:


UPDATE: очистка цикла index.php после помощи @sMyles и @JackJohansson

Цикл Index.php:

 $args = array( 'posts_per_page' => - 1, 'meta_key' => 'meta-checkbox', 'orderby' => array( 'meta_value' => 'DESC', 'date' => 'DESC') ); $posts = new WP_Query( $args ); if($posts->have_posts() ){ while( $posts->have_posts() ){ $posts->the_post(); // Set to content template by default $template = 'content'; // Change template to featured when `is_featured` meta has a value if(get_post_meta(get_the_ID(), 'meta-checkbox', 'yes')){ $template = 'featured'; } // Load template part get_template_part( $template, get_post_format() ); } } 

ОБНОВЛЕНИЕ: Как было предложено, я добавил, где я использую предыдущую функцию post

Предыдущая функция сообщения

 <div id="next-post"> <?php $prev_post = get_previous_post(); if(!empty($prev_post)) { echo '<a class="next-story" href="' . get_permalink($prev_post->ID) . '">Next Story</a>'; echo '<a class="next-story-title" href="' . get_permalink($prev_post->ID) . '" title="' . $prev_post->post_title . '">' . $prev_post->post_title . '</a>'; } ?> </div> 

Функция для избранных сообщений:

 function sm_custom_meta() { add_meta_box( 'sm_meta', __( 'Featured Posts', 'sm-textdomain' ), 'sm_meta_callback', 'post' ); } function sm_meta_callback( $post ) { $featured = get_post_meta( $post->ID ); ?> <p> <div class="sm-row-content"> <label for="meta-checkbox"> <input type="checkbox" name="meta-checkbox" id="meta-checkbox" value="yes" <?php if ( isset ( $featured['meta-checkbox'] ) ) checked( $featured['meta-checkbox'][0], 'yes' ); ?> /> <?php _e( 'Featured this post', 'sm-textdomain' )?> </label> </div> </p> <?php } add_action( 'add_meta_boxes', 'sm_custom_meta' ); function sm_meta_save( $post_id ) { // Checks save status $is_autosave = wp_is_post_autosave( $post_id ); $is_revision = wp_is_post_revision( $post_id ); $is_valid_nonce = ( isset( $_POST[ 'sm_nonce' ] ) && wp_verify_nonce( $_POST[ 'sm_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false'; // Exits script depending on save status if ( $is_autosave || $is_revision || !$is_valid_nonce ) { return; } // Checks for input and saves if( isset( $_POST[ 'meta-checkbox' ] ) ) { update_post_meta( $post_id, 'meta-checkbox', 'yes' ); } else { update_post_meta( $post_id, 'meta-checkbox', '' ); } } add_action( 'save_post', 'sm_meta_save' ); 

Вы должны просто выполнить новый полный запрос для всех сообщений (а не только для избранных) и установить meta_value в meta_value и просто проверить, когда выполняете цикл, если это мета-значение сообщения yes , и вывести шаблон с meta_value , иначе вывести стандартный ,

https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

UPDATE: Может быть, что-то вроде этого:

 $args = array( 'posts_per_page' => - 1, 'meta_key' => 'meta-checkbox', 'orderby' => array( 'meta_value' => 'DESC', 'date' => 'DESC') ); $posts = new WP_Query( $args ); if($posts->have_posts() ){ while( $posts->have_posts() ){ $posts->the_post(); // Set to content template by default $template = 'content'; // Change template to featured when `is_featured` meta has a value if(get_post_meta(get_the_ID(), 'meta-checkbox', true )){ $template = 'featured'; } // Load template part get_template_part( $template, get_post_format() ); } } 

Вы заметите, что я заменил мета-ключ на is_featured . Хорошей практикой является использование подчеркиваний вместо дефиса.

Чтобы получить значение для мета в сообщении, просто используйте объект $post который имеет магический метод __get PHP, который будет возвращать метатег сообщения, если он существует.

http://php.net/manual/en/language.oop5.overloading.php#object.get

Добавьте это в файл functions.php вашей дочерней темы, чтобы изменить основной запрос цикла:

 add_action( 'pre_get_posts', 'smyles_main_query_custom_orderby' ); /** * Modify main post query sort by meta key and date * * @param \WP_Query $query */ function smyles_main_query_custom_orderby( $query ) { // Verify query is main blog archive if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'meta_key', 'meta-checkbox' ); $query->set( 'orderby', array( 'meta_value' => 'DESC', 'date' => 'DESC' ) ); } } 

https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts https://make.wordpress.org/core/2014/08/29/a-more-powerful-order-by-in-wordpress-4-0 /

Тогда ваш цикл index.php может выглядеть следующим образом:

 if ( have_posts() ) { while( have_posts() ) { the_post(); $template = get_post_meta( get_the_ID(), 'meta-checkbox', true ) ? 'featured' : 'content'; // This could have just been the code below had you used underscores like I previously mentioned // $template = $post->meta_checkbox ? 'featured' : 'content'; // Load template part get_template_part( $template, get_post_format() ); } }