Intereting Posts

Хранить листы липкой почты в переходном режиме

Я разрабатываю тему, в которой есть раздел с выделенными сообщениями перед основным контуром сообщений. Прохладный и свежий, правда? 🙂 Все липкие сообщения с изображением на месте должны быть показаны в этом разделе и исключены из основного цикла. Очень просто. Выполняя мои исследования, я наткнулся на довольно старую статью по этому вопросу, которую я нашел очень полезной. Он выступает за то, чтобы не использовать query_posts , что я делал раньше, и предлагает более элегантный подход:

  /** * Filter the home page posts, and remove any featured post ID's from it. Hooked * onto the 'pre_get_posts' action, this changes the parameters of the query * before it gets any posts. * * @global array $featured_post_id * @param WP_Query $query * @return WP_Query Possibly modified WP_query */ function itheme2_home_posts( $query = false ) { // Bail if not home, not a query, not main query, or no featured posts if ( ! is_home() || ! is_a( $query, 'WP_Query' ) || ! $query->is_main_query() || ! itheme2_featuring_posts() ) return; // Exclude featured posts from the main query $query->set( 'post__not_in', itheme2_featuring_posts() ); // Note the we aren't returning anything. // 'pre_get_posts' is a byref action; we're modifying the query directly. } add_action( 'pre_get_posts', 'itheme2_home_posts' ); /** * Test to see if any posts meet our conditions for featuring posts. * Current conditions are: * * - sticky posts * - with featured thumbnails * * We store the results of the loop in a transient, to prevent running this * extra query on every page load. The results are an array of post ID's that * match the result above. This gives us a quick way to loop through featured * posts again later without needing to query additional times later. */ function itheme2_featuring_posts() { if ( false === ( $featured_post_ids = get_transient( 'featured_post_ids' ) ) ) { // Proceed only if sticky posts exist. if ( get_option( 'sticky_posts' ) ) { $featured_args = array( 'post__in' => get_option( 'sticky_posts' ), 'post_status' => 'publish', 'no_found_rows' => true ); // The Featured Posts query. $featured = new WP_Query( $featured_args ); // Proceed only if published posts with thumbnails exist if ( $featured->have_posts() ) { while ( $featured->have_posts() ) { $featured->the_post(); if ( has_post_thumbnail( $featured->post->ID ) ) { $featured_post_ids[] = $featured->post->ID; } } set_transient( 'featured_post_ids', $featured_post_ids ); } } } // Return the post ID's, either from the cache, or from the loop return $featured_post_ids; } 

Все работает отлично, за исключением переходных процессов. Я не могу понять, как сбросить переходный процесс, если sticky_posts обновлен. Наверное, используйте updated_option hook? Поблагодарили бы за любую помощь.

Solutions Collecting From Web of "Хранить листы липкой почты в переходном режиме"

Можешь попробовать:

 add_action('update_option_sticky_posts', function( $old_value, $value ) { $featured_args = array( 'post__in' => $value, 'post_status' => 'publish', 'no_found_rows' => true ); // The Featured Posts query. $featured = new WP_Query( $featured_args ); // Proceed only if published posts with thumbnails exist if ( $featured->have_posts() ) { while ( $featured->have_posts() ) { $featured->the_post(); if ( has_post_thumbnail( $featured->post->ID ) ) { $featured_post_ids[] = $featured->post->ID; } } set_transient( 'featured_post_ids', $featured_post_ids ); } }, 10, 2); 

Я полагаю, у вас есть идентификаторы сообщений на опции sticky_posts , поэтому вы запрашиваете с этим в WP_Query

Класс WP_Query предлагает параметр для включения / исключения липких сообщений. Там нет необходимости хранить свои идентификаторы где угодно. Просто создайте новый запрос и выведите липкие сообщения с изображением с изображением:

 $sticky = get_option( 'sticky_posts' ); $query = new WP_Query( array( 'p' => $sticky ) ); 

Теперь вы можете создать еще один цикл и исключить липкие сообщения:

 $query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) ); 

Вы также можете установить 'ignore_sticky_posts' => 1 чтобы игнорировать липкие сообщения в вашем цикле.

Это все, что вам нужно.