Intereting Posts
как показать отдельную запись в пользовательском шаблоне почему category__and и category__in не работают togather? Как включить пользователя для добавления значения через панель администратора? Slick + PHP + ACF + JQuery слайд не работает SSL через другой домен и путь с помощью NGINX / PHP-FPM / WP Как автоматически войти в систему пользователя после изменения user_login Удаление категории по умолчанию в wordpress rewrite_rule () не сохраняет строку запроса wp_remote вместо file_get_contents на non json Отображать теги из определенной категории в выбранных полях 301 Redirect Loop Создайте раскрывающийся список с настраиваемыми типами сообщений в качестве опции в admin Что делать с взломанным сервером? Какие плагины я могу использовать для создания (присоединенного) продукта в своем блоге (от Amazon.com)? Можно добавить аватар аватара автора, чтобы он отображался для всех, а не только зарегистрированных / зарегистрированных пользователей?

Список сообщений по категории для нулевой, не-NULL пользовательских значений поля?

( Заметки модераторов: оригинальное название было: «Нужна помощь в определении и циклировании по категориям, где сообщения имеют настраиваемый набор полей»)

Мне нужно перебирать мои категории, но мне нужно ограничить категории теми категориями, которые содержат сообщения, где пользовательское поле price != 0 или null .

Каков наилучший способ справиться с этим?

В настоящее время у меня есть это …

 <div id="page-categories" style="margin-top:-34px;"> <!-- PRINT CATEGORY LISTINGS --> <?php $categories=get_categories(); foreach($categories as $category) { $myColumnCount = 1; ?> <h2 style="clear:both;"><a href="<?php bloginfo('url'); ?>/category/<?php echo($category->slug); ?>"><?php echo($category->name); ?></a></h2> <?php query_posts('cat='.$category->cat_ID. '&posts_per_page=-1&orderby=title&order=ASC'); ?> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <!-- POST DISPLAYING CODE GOES HERE --> <div id="" class="span-1 <?php if ($myColumnCount==6) { echo "last"; } ?> thumb20" > <a class="thumb" href="<?php the_permalink(); ?>" rel="bookmark" title="Link to <?php the_title(); ?>" ><?php echo the_post_thumbnail( 'thumbnail' ); ?></a> </div> <!-- YOUR POST DISPLAYING CODE GOES HERE --> <?php if ($myColumnCount == 6) { $myColumnCount=0; } ?> <?php $myColumnCount = $myColumnCount+1; ?> <?php endwhile; endif; echo '<hr class="gallery-grid" />'; ?> <?php } ?> <?php $wp_query = $temp_query; ?> </div> 

Solutions Collecting From Web of "Список сообщений по категории для нулевой, не-NULL пользовательских значений поля?"

Привет @Brian Fidler :

Существует несколько способов решения этой проблемы. Я выбрал тот, который может казаться более сложным, но более легким для кода темы, а также автономным и, вероятно, более эффективным, чем некоторые другие подходы (что, безусловно, более показательно, чем повторение query_posts() для каждой категории.)

В основном я создал класс, называемый PostsByCategoryWithPrice где вы вызываете static method query() чтобы получить список сообщений. Он также имеет вспомогательный метод, называемый get_category() для инкапсуляции поиска информации о категории.

Он возвращает список сообщений, упорядоченных по названию категории, чтобы вы могли <h2>{$post_title}</h2> их и <h2>{$post_title}</h2> каждый раз, когда категория изменяется. Конечно, он отфильтровывает любые без цены. И он использует get_category_link() чтобы удалить эту сложность из вашего кода.

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

 $category = PostsByCategoryWithPrice::get_category(0); $posts = PostsByCategoryWithPrice::query(); $column=0; foreach($posts as $post) { if ($column++>6) $column = 1; if ($category->id != $post->category_id) { $category = PostsByCategoryWithPrice::get_category($post); ?> <h2 style="clear:both;"> <a href="<?php echo get_category_link($category->id); ?>"> <?php echo($category->name); ?></a> </h2><?php }?> <div class="span-1 thumb20<?php echo ($count==6 ? ' last' : ''); ?>"> <a class="thumb" href="<?php the_permalink(); ?>" rel="bookmark" title="Link to <?php the_title(); ?>"> <?php echo the_post_thumbnail( 'thumbnail' ); ?> </a> </div><?php }?> <hr class="gallery-grid" /> 

Далее следует класс PostsByCategoryWithPrice1 . Он использовал четыре крючка для изменения WP_Query() : они: 'posts_fields' , 'posts_join' , 'posts_where' и 'posts_orderby' . Класс выглядит более сложным, чем некоторые люди могут быть знакомы, но на самом деле это не так сложно, просто инкапсулировать крючки, чтобы они не влияли на какую-либо другую часть вашего сайта.

Я должен был использовать все крючки, и особенно четыре (4) соединения, потому что, хотя WP_Query() будет выполнять таксономию и мета-соединения, он соответственно делает это только тогда, когда вы фильтруете по таксономии и только когда у вас есть точное соответствие для meta_value , а не тот, где нужно учитывать NULL (недавно я попросил, чтобы что-то было добавлено в ядро ​​WordPress для сравнения с NULL и мне сказали, что это хорошая идея для основного члена команды, но его пока нет).

 class PostsByCategoryWithPrice { static $hooks = array(); private static function push_action($hook,$callable,$priority=10,$params=1) { self::$hooks[$hook] = $callable; add_action($hook,$callable,$priority,$params); } private static function pop_action($count=1) { for($i=$count; $i>0; $i--) { $hook = end(array_keys(self::$hooks)); $callable = array_pop(self::$hooks); remove_action($hook,$callable); } } static function get_category($post=false) { if (!$post) $category = (object)array('id'=>false); else $category = (object)array( 'id' => $post->category_id, 'name' => $post->category_name, 'slug' => $post->category_slug, ); return $category; } static function query() { self::push_action('posts_fields',array(__CLASS__,'posts_fields')); self::push_action('posts_join',array(__CLASS__,'posts_join')); self::push_action('posts_where',array(__CLASS__,'posts_where')); self::push_action('posts_orderby',array(__CLASS__,'posts_orderby')); $query = new WP_Query("posts_per_page=-1"); self::pop_action(4); return $query->posts; } static function posts_fields($fields) { global $wpdb; $fields .= ",{$wpdb->terms}.term_id AS category_id, {$wpdb->terms}.name AS category_name, {$wpdb->terms}.slug AS category_slug"; return $fields; } static function posts_join($join) { global $wpdb; $join .=<<<SQL INNER JOIN {$wpdb->postmeta} ON {$wpdb->postmeta}.post_id={$wpdb->posts}.ID AND {$wpdb->postmeta}.meta_key='price' INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id INNER JOIN {$wpdb->terms} ON {$wpdb->term_taxonomy}.term_id={$wpdb->terms}.term_id SQL; return $join; } static function posts_where($where) { global $wpdb; $where .=" AND {$wpdb->term_taxonomy}.taxonomy='category' AND IFNULL({$wpdb->postmeta}.meta_value,'0')!='0' "; return $where; } static function posts_orderby($orderby) { global $wpdb; $orderby = " {$wpdb->term_taxonomy}.name, {$wpdb->posts}.post_title ASC "; return $orderby; } } с class PostsByCategoryWithPrice { static $hooks = array(); private static function push_action($hook,$callable,$priority=10,$params=1) { self::$hooks[$hook] = $callable; add_action($hook,$callable,$priority,$params); } private static function pop_action($count=1) { for($i=$count; $i>0; $i--) { $hook = end(array_keys(self::$hooks)); $callable = array_pop(self::$hooks); remove_action($hook,$callable); } } static function get_category($post=false) { if (!$post) $category = (object)array('id'=>false); else $category = (object)array( 'id' => $post->category_id, 'name' => $post->category_name, 'slug' => $post->category_slug, ); return $category; } static function query() { self::push_action('posts_fields',array(__CLASS__,'posts_fields')); self::push_action('posts_join',array(__CLASS__,'posts_join')); self::push_action('posts_where',array(__CLASS__,'posts_where')); self::push_action('posts_orderby',array(__CLASS__,'posts_orderby')); $query = new WP_Query("posts_per_page=-1"); self::pop_action(4); return $query->posts; } static function posts_fields($fields) { global $wpdb; $fields .= ",{$wpdb->terms}.term_id AS category_id, {$wpdb->terms}.name AS category_name, {$wpdb->terms}.slug AS category_slug"; return $fields; } static function posts_join($join) { global $wpdb; $join .=<<<SQL INNER JOIN {$wpdb->postmeta} ON {$wpdb->postmeta}.post_id={$wpdb->posts}.ID AND {$wpdb->postmeta}.meta_key='price' INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id INNER JOIN {$wpdb->terms} ON {$wpdb->term_taxonomy}.term_id={$wpdb->terms}.term_id SQL; return $join; } static function posts_where($where) { global $wpdb; $where .=" AND {$wpdb->term_taxonomy}.taxonomy='category' AND IFNULL({$wpdb->postmeta}.meta_value,'0')!='0' "; return $where; } static function posts_orderby($orderby) { global $wpdb; $orderby = " {$wpdb->term_taxonomy}.name, {$wpdb->posts}.post_title ASC "; return $orderby; } } 

Вот самодостаточная /test.php версия вышеуказанного кода, которую вы можете сохранить в корне вашего сайта (например, /test.php ?), Чтобы проверить его для вашего прецедента. Как только вы его заработаете, вы можете скопировать класс в файл functions.php вашей темы и / или в файл .php плагина, который вы строите, и использовать код шаблона в своей теме в файле «Шаблон страницы» (или файл шаблона пользовательского типа), где вы хотите отображать эти миниатюры сообщений.

Вы можете скачать его из Gist :

  • сообщения-по-категория-с-price.php

Не используйте для этого query_posts() . Всегда используйте get_posts() или WP_Query для вторичных циклов.

Попробуйте что-то вроде этого:

 $categories = get_categories(); foreach ( $categories as $category ) { $posts = get_posts( array( 'cat' => $category->cat_ID, 'posts_per_page' => '-1', 'orderby' => 'title', 'order' => 'ASC', 'meta_key' => 'price', 'meta_compare' => '>', 'meta_value' => '0' ) ); if( !count( $posts ) ) continue; // else we have some posts in this category }