Вывод постов по значениям произвольных полей при помощи meta_query класса WP_Query

Пост будет состоять из двух частей, в первой разберемся вообще с тем, что можно сделать при помощи meta_query, а во-второй рассмотрим несколько примеров по работе с произвольными полями без использования meta_query вообще.

Часть 1. Примеры использования meta_query

Вывод постов по значению произвольного поля

Начнем с самого простого примера, предположим, нам нужно вывести все товары синего цвета:

// значение произвольного поля 'color' равно 'blue'
$true_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => 'blue'
		)
	)
);
$true_query = new WP_Query( $true_args );

Если вы заглянете на страницу редактирования любого из полученных в данном примере товаров, то в блоке «Произвольные поля» вы увидите следующее:

Имя и Значение произвольного поля

Хочу заметить, что примеры упрощены, в массиве аргументов по-любому должны быть такие параметры, как posts_per_page (количество постов, отображаемых на странице) и скорее всего post_type (отдельный тип поста для товаров). То есть мы рассматриваем чисто meta_query и ничего лишнего.

Также можно сделать и наоборот — то есть, чтобы выводились все товары, кроме товаров синего цвета:

// значение произвольного поля 'color' не равно 'blue'
$true_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => 'blue',
			'compare' => '!=' // оператор сопоставления
		)
	)
);
$true_query = new WP_Query( $true_args );

А теперь те же самые примеры, но только добавим еще один цвет. Итак, сначала выводим все товары синего или красного цвета:

// значение произвольного поля 'color' равно 'blue' ИЛИ 'red'
$true_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => array('blue','red'),
			'compare' => 'IN'
		)
	)
);
$true_query = new WP_Query( $true_args );

А теперь все товары, кроме товаров синего и товаров красного цвета:

// значение произвольного поля 'color' не равно 'blue' И не равно 'red'
$true_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => array('blue','red'),
			'compare' => 'NOT IN'
		)
	)
);
$true_query = new WP_Query( $true_args );

Вывод постов по диапазону значений произвольного поля

Ну в случае с товарами удобно будет вывести их по диапазону цен, например выведем все товары, которые дороже 1000 и дешевле 3000:

// значение произвольного поля 'price' больше 1000 и меньше 3000
$true_args = array(
	'meta_query' => array(
		array(
			'key' => 'price',
			'value' => array( 1000, 3000 ),
			'type' => 'numeric',
			'compare' => 'BETWEEN'
		)
	)
);
$true_query = new WP_Query( $true_args );

Сравнивание значений произвольных полей

Разделим предыдущий пример на два примера:

  • В первом — цена товаров будет больше 1000 (или равна 1000)
  • Во втором — цена товаров будет строго меньше 3000
// значение произвольного поля 'price' больше или равно 1000
$true_args = array(
	'meta_query' => array(
		array(
			'key' => 'price',
			'value' => 1000,
			'type' => 'numeric',
			'compare' => '>='
		)
	)
);
$true_query = new WP_Query( $true_args );
// значение произвольного поля 'price' меньше 3000
$true_args = array(
	'meta_query' => array(
		array(
			'key' => 'price',
			'value' => 3000,
			'type' => 'numeric',
			'compare' => '<'
		)
	)
);
$true_query = new WP_Query( $true_args );

Вывод постов по значениям нескольких произвольных полей

Ничего особо нового придумывать здесь не буду — просто объединю предыдущие примеры, например, чтобы товар был синего цвета И чтобы его цена была от 1000 до 3000, вот как будет выглядеть массив параметров:

// значение произвольного поля 'color' равно 'blue' И значение 'price' находится в диапазоне от 1000 до 3000
$true_args = array(
	'meta_query' => array(
		'relation' => 'AND',
		array(
			'key' => 'color',
			'value' => 'blue'
		),
		array(
			'key' => 'price',
			'value' => array( 1000, 3000 ),
			'type' => 'numeric',
			'compare' => 'BETWEEN'
		)
	)
);
$true_query = new WP_Query( $true_args );

Часть 2. Работа с произвольными полями без помощи meta_query

Тут особо и не о чем рассказывать, если параметр WP_Query meta_key (название параметра) и есть meta_value (значение параметра, для числовых значений — meta_value_num) . А ещё есть параметр сопоставления meta_compare.

Теперь рассмотрим пример. Допустим, некоторые из постов мы должны отобразить на главной странице. Давайте выведем эти посты:

$true_args = array(
	'meta_key' => 'homepage_show_it',
	'meta_value' => 'on'
);
 
$true_query = new WP_Query( $true_args );

А теперь получим все остальны посты, т.е. у которых параметр homepage_show_it не равен on.

$true_args = array(
	'meta_key' => 'homepage_show_it',
	'meta_value' => 'on',
	'meta_compare' => '!='
);
 
$true_query = new WP_Query( $true_args );
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 73

  • Влад2 мая 2014 в 11:05 #

    Добрый день! Спасибо за статью. Подскажите, пожалуйста, у меня стоит плагин 'Advanced Custom Fields', и добавлен тип поля чекбокс, где есть 2 значения "желтый" и "темный", название поля "оттенок", как мне вывести все статьи скажем, со значнием "желтый"? пробовал просто писать meta_key=оттенок&meta_value=темный, но так не работает. Очень надеюсь на Вашу помочь, спасибо)

  • VRS27 июля 2014 в 05:07 #

    Привет, Миша!
    Я опять к тебе за советом)).
    Как бы реализовать вывод похожих по произвольным полям страниц?

    Попыталась видоизменить с похожих по тегам записей:

    <?php
    global $post;
    { ?>
        <div id="related">
        <?php
        $mpid = $post->ID;
        $tags = get_post_meta($mpid);
     
     if ($tags) :
          $tag_ids = array();
    	  echo '<span>Похожие коллекции:</span>';
          foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;
     
     $args=array(
    		'meta_query' => array(
    		'relation' => 'OR',
    		array(
    			'key' => 'search_color',
    			'value' => $search_color_value,
    			'compare' => 'IN'
    		),
    		array(
    			'key' => 'search_size',
    			'value' => $search_size_value,
    			'compare' => 'IN'
    		),
    		array(
    			'key' => 'search_price',
    			'value' => $search_price_value,
    			'compare' => 'IN'
    		)
    	),
             'post__not_in' => array($post->ID),
             'showposts'=> 6
    		 'orderby'=> 'rand',
    		 'post_type' =>  'page',
             'caller_get_posts'=> 1
          );
         $rp_query = new wp_query($args);
         endif;
         if($rp_query):
          if($rp_query->have_posts()) ?>
            <ul><?php while ($rp_query->have_posts()):  $rp_query->the_post(); ?>
             <!-- вывод похожих постов -->
             <li><h3 class="post-title"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3><span><?php if ( has_post_thumbnail() ) { the_post_thumbnail('thumbnail'); } ?></span><span><?php kama_excerpt(); ?></span></li>
             <!-- /вывод похожих постов-->
            <?php endwhile; ?>
         <?php else: ?>
           <?php _e("",""); ?>
         <?php endif; wp_reset_query(); ?>
     
       </ul></div>
        <?php
        $post->ID = $mpid;
        }

    Но что-то видимо не то.. не работает..
    Можешь подсказать?

  • VRS27 июля 2014 в 05:07 #

    Я понимаю, что надо как-то получить массив значений этих трех произвольных полей и затем сравнивать их в строке 'value' => $search_color_value
    Но как - башка под утро уже не варит..

    • Миша27 июля 2014 в 06:07 #

      Привет)
      А можно поконкретнее, какая задача перед нами стоит? Что-то я не совсем понял. Выводим страницы, у которых... ?

      • VRS27 июля 2014 в 13:07 #

        Привет),
        сама спросила, сама решила)
        Нужно было на статической странице выводить список похожих страниц, по совпадению значений произвольных полей.
        Я использовала get_post_custom_values, чтобы получить значения.

        • lark11 августа 2014 в 13:08 #

          Скажите, пожалуйста, у вас получилось наладить вывод похожих страниц? Я вот бьюсь несколько дней над подобной задачей - вывести похожие записи, если значения в чекбоксах совпадают. Но все бестолку. Выводит неправильно:( Можно на ваш кусок кода готовый посмотреть и на сайт взглянуть, где это реализовано? Если бы одно значение похожее - не было бы проблемы похожие записи вывести, а с массивами у меня беда. Спасибо.

          • Миша11 августа 2014 в 21:08 #

            У себя в похожих записях я указываю их IDы, если же IDы не указаны, то записи выводятся рандомно.

            • lark12 августа 2014 в 16:08 #

              Мне хочется избежать ручного ввода, т.к. много записей - карточек товаров. У каждого товара есть характеристика (custom field) - color. У него может быть несколько значений одновременно - красный, бежевый, синий. Как вывести другие карточки товаров с одним или несколькими совпадающими значениями цвета? Т.е. надо, чтобы анализировалось значение color текущего товара и на основании этого значения выводились записи с таким же значением.

              • Миша13 августа 2014 в 09:08 #

                чтобы анализировалось значение color текущего товара и на основании этого значения выводились записи с таким же значением

                Вы сами ответили на свой вопрос :)

  • Антон1 декабря 2014 в 22:12 #

    Здравствуйте!! Помогите мне пожалуйста с проблемой. У меня установлен ACF плагин который в админке ставит кастомное поле селекта со множественным выбором. На сайте есть форма на ней 4 чекбокса мне надо что бы по щелчку по чекбоксу просходила выборка постов в помеченными пунктами селекта которые указаны в админке.
    Т.е у меня в ACF написано так

    prin : Принтер
    scan : Сканер
    copy : Копир
    fax : Факс

    в HTML так Принтер
    Сканер
    Копир
    Факс

    и по отправке формы все значения чекбокса влетают в переменную пробовал вот так но у меня ничего не просходит

    $args = array(
                'numberposts' => -1,
                'post_type' => 'goods',
                'meta_query' => array(
     
                    array(
                        'key' => 'function',
                        'value' => $_POST['function'],
                        'compare' => 'IN'
                    )
                )
            );

    пожалуйста помогите мне разобраться!!

  • VRS22 февраля 2015 в 05:02 #

    Привет, снова я к тебе =), спустя полгода обнаружила проблему.
    Написала я фильтр, который ищет по цвету, размеру, типу и цене. Загвоздка, если у страницы нет произвольного поля цены, то она не показывается.
    Код meta_query такой:

    $query->set('meta_query',  array(
                'relation' => 'AND',
                // this is the part that gets a key with no value
    			$search_color,
    			$search_size,
    			$search_type,
     
    			array(
                   'key' => 'search_price',
                    'value' => array($min_price, $max_price),
    				'type' => 'numeric',
                    'compare' => 'BETWEEN'
                )
     
    		)

    Как бы дописать, чтобы в результатах были страницы, не только с заданным интервалом, но и в том числе вообще без поля цены?

    • Миша22 февраля 2015 в 08:02 #

      Привет!)
      Я думаю, что:

      $query->set('meta_query',  array(
      	'relation' => 'OR',
      	array(
      		'key' => 'search_price',
      		'value' => array($min_price, $max_price),
      		'type' => 'numeric',
                      'compare' => 'BETWEEN'
      	),
      	array(
      		'key' => 'search_price',
      		'compare' => 'NOT EXISTS'
      	)
      )
      • VRS22 февраля 2015 в 14:02 #

        А как же быть с остальными параметрами? В них-то нужна логика "И" - красный и 10х10..

    • Миша22 февраля 2015 в 16:02 #

      Тогда мне нужен полный первоначальный код, в том числе содержимое переменных:

      $search_color,
      $search_size,
      $search_type,

      • VRS22 февраля 2015 в 16:02 #
         
        function SearchFilter($query) {
            if ($query->is_search  && $query->is_main_query() && !is_admin()) {
               $query->set('post_type', 'page');
         
         
        		if (isset($_GET['search_color'])) {
        		 $search_color =           array(
                       'key' => 'search_color',
                        'value' => $_GET['search_color'],
                        'compare' => 'LIKE'
                    );
        		}
         
        		if (isset($_GET['search_size'])) {
        		$search_size = array(
                       'key' => 'search_size',
                        'value' => $_GET['search_size'],
                        'compare' => 'LIKE'
                    );
         
        		}
         
        		if (isset($_GET['search_type'])) {
        		$search_type = array(
                       'key' => 'search_type',
                        'value' => $_GET['search_type'],
                        'compare' => 'LIKE'
                    );
         
        		}
        		$min_price = $_GET['min_price'];
        		if (!$min_price) {
        		$min_price = 0;		
        		}
        		$max_price = $_GET['max_price'];
        		if (!$max_price) {
        		$max_price = 99999;		
        		}
         
        		if ($search_color or $search_size) {
        		$query->set('meta_query',  array(
                    'relation' => 'AND',
        			$search_color,
        			$search_size,
        			$search_type,
         
        			array(
                       'key' => 'search_price',
                        'value' => array($min_price, $max_price),
        				'type' => 'numeric',
                        'compare' => 'BETWEEN'
                    )
        		)
         
        		);   
         
        		}
         
            }
         
         
            return $query;
        }
         
        add_filter('pre_get_posts','SearchFilter');
        • Миша23 февраля 2015 в 07:02 #

          У тебя всегда нереальные задачи :) Не в смысле невыполнимые, а в смысле сложные и интересные. Итак:

          $query->set('meta_query',  array(
          	'relation' => 'OR',
          	array(
          		'relation' => 'AND',
          		$search_color,
          		$search_size,
          		$search_type,
          		array(
          			'key' => 'search_price',
          			'value' => array($min_price, $max_price),
          			'type' => 'numeric',
          			'compare' => 'BETWEEN'
          		)
          	),
          	array(
          		'key' => 'search_price',
          		'compare' => 'NOT EXISTS'
          	)
          )
          );
          • VRS23 февраля 2015 в 17:02 #

            Что-то не срабатывает. При любых запросах выводит - одинаковое количество страниц.
            Такой вариант тоже не работает:

            $query->set('meta_query',  array(
            					'relation' => 'OR',
            					array(
            						'relation' => 'AND',
            						$search_color,
            						$search_size,
            						$search_type,
            						array(
            							'key' => 'search_price',
            							'value' => array($min_price, $max_price),
            							'type' => 'numeric',
            							'compare' => 'BETWEEN'
            						)
            					),
            					array(
            						'relation' => 'AND',
            						$search_color,
            						$search_size,
            						$search_type,
            						array(
            						'key' => 'search_price',
            						'compare' => 'NOT EXISTS'
            						)
            					)
            				)

            Попробовала принудительно вписать остальные ключи цвет и размер, но опять то же кол-во страниц. Т.е. почему-то не срабатывает цикл, если вложенный.

  • VRS23 февраля 2015 в 17:02 #

    Всё, поняла почему, у меня ВП 4.0, а вложенность только с 4.1

  • Ольга15 марта 2015 в 10:03 #

    Здравствуйте! У меня на сайте стоит плагин для поиска по пользовательским полям WP Custom Fields Search. И он отлично работает со всеми полями и рубриками, за исключением тех, названия которых (с смысле значения поля или рубрик) на русском. К примеру, если есть польз. поле zvet и его значение "красный", то в форме поиска, которую можно создать с помощью плагина, поле выбора цвета пустое. Если написать на английском, к примеру, krasnyi, то в поле появляется эта надпись. Интуитивно понимаю, что проблемы с кодировкой. Но не могу понять, как это исправить? Какой файл нужно сохранить в другой кодировке. Может, вы что-то подскажите?

    • Миша15 марта 2015 в 18:03 #

      Здравствуйте!
      Плагин просто не поддерживает кириллицу, как исправить, не знаю. Возможно попробовать поменять строковые функции в файлах плагина на mb_ аналоги.

  • Артем16 июля 2015 в 00:07 #

    Михаил, приветствую! Есть произвольные поля у записей, поля числовые. Одним словом есть много записей с одним произвольным полем. Надо сложить все эти поля чтобы получить их сумму. И вывести на отдельной странице. Вопрос как это сделать, если это вообще возможно?

    • Миша16 июля 2015 в 12:07 #

      Добрый день!

      $summa = 0;
      $q = new WP_Query('posts_per_page=-1');
      while( $q->have_posts() ) : $q->the_post();
      $summa = $summa + get_post_meta( $q->post->ID, 'название', true); 
      endwhile;

      Если складываться не будет, можно в intval() обернуть)

      • Артем16 июля 2015 в 16:07 #

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

        $fields = CFS()->get('counts');
        								$i=0;
        								echo '<table>';
        								foreach ($fields as $field) {
        									$i++;
        									foreach ($field['sporsmen'] as $valueid) {
        									$the_post = get_post($valueid);
        									echo '<tr><td>'.$i.'<td><td>'.$the_post->post_title. '</td> <td>'. $field['baals']. '</td></tr>';
         
        									}								
        								}
        								echo '</table>';

        И как вытащить из этого перебора конкретное поле мне пока не понятно... Может что-то присоветуете?

        • Миша17 июля 2015 в 07:07 #

          Для начала гляньте, что содержится в массиве $fields и сразу всё станет понятно:

          print_r( $fields );
          • Артем17 июля 2015 в 12:07 #

            Огромная благодарность! Совет помог. Даже складывает все))) Но есть другой момент - почему-то он мне выводить данные из одной и той же записи. Цикл пробегает, а данные не изменяются... Поставил сброс данных не помогает...

      • Дмитрий25 сентября 2016 в 09:09 #

        Миша, а как переориентировать тоже самое, только на комментарий? Нужно вывести в комментарии результат сложения сохраненных мета данных, которые были введены в форме этого комментария при его отправке.
        Формула, я так понял, будет такая:

        $summa = $summa + get_comment_meta( $comment->comment_ID, 'key1', true) + get_comment_meta( $comment->comment_ID, 'key2', true);

        И нужно условие поменять, вроде как на такое:

        if( $comments = get_comments( $args )
      • Дмитрий3 октября 2016 в 00:10 #

        Миша, подскажи плиз, как быть: в каждом комментарии есть расчетная переменная через формулу. Как мне теперь сложить все эти переменные для поста от каждого комментария?
        Это расчетное значение получается, что уже не метаданные, поэтому не могу ничего сложить.

  • Егор23 июля 2015 в 17:07 #

    Добрый вечер.
    Подскажите, на главной необходимо вывести несколько постов по количеству просмотров, они записываются в произвольное поле. К примеру я могу вывести все записи с просмотрами от 20 до 30 (неважно). Как мне вывести допустим 4-5 записи с максимальным числом просмотров?

  • Дмитрий26 января 2016 в 12:01 #

    Миша, добрый день!
    А как записать значение произвольного поля, если оно будет известно только при добавлении страницы.
    Сейчас я завожу постоянно новый шаблон для каждой марки машины и выважу таким образом
    query_posts(array( 'meta_key' => 'auto', 'meta_value' => 'Audi', 'meta_compare' => '=' )); , может можно как то сделать так вот, query_posts(array( 'meta_key' => 'auto', 'meta_value' => 'значение, которое будет отображаться когда будет заведен шаблон страницы', 'meta_compare' => '=' ));

    Спасибо!

  • Макс29 января 2016 в 08:01 #

    Приветствую!
    Есть произвольное поле "Скидки" (в процентах). Можно ли упорядочить посты по размеру скидки в порядке убывания? Т.е. на первом месте пост с самой большой скидкой, на последнем - с самой маленькой (между ними соответственно идут другие посты в порядке убывания скидки).
    Спасибо!

    • Миша29 января 2016 в 10:01 #

      Привет!
      А значок % присутствует в произвольном поле?

      • Макс29 января 2016 в 10:01 #

        Значок % присутствует, но можно и убрать, если это мешает

        • Миша30 января 2016 в 09:01 #

          Да, лучше убрать, и параметры сортировки для WP_Query будут примерно такими:

          $args = array( 'meta_key'=>'название поля', 'orderby'=>'meta_value_num', 'order'=>'ASC' );
  • Дмитрий12 сентября 2016 в 22:09 #

    Миша, привет. Столкнулся с такой задачей:
    Есть набор постов с параметрами. У каждого поста есть одинаковое польз. поле со значением (числовым). Мне нужно перебрать их все и вывести из них минимальное значение в ячейку на странице, потом в соседнюю ячейку максимальное, т.е. чтобы была запись что-то вроде от ___ до ____. Как это можно сделать, можешь подсказать?

    • Миша13 сентября 2016 в 08:09 #

      Привет, я думаю тут оптимальнее всего использовать сортировку по проивольному полю, как например:

      $args = array(
      	'meta_key' => 'название поля',
      	'orderby' => 'meta_value_num', // сортировать по числовому значению
      	'order'=> 'DESC' // по убыванию
      );
      • Дмитрий13 сентября 2016 в 09:09 #

        Тогда еще придется вывести в ячейку значение польз. поля поста, который в сортировке первый/последний (мин./макс), так?

        • Миша13 сентября 2016 в 10:09 #

          В общем если просто нужно из всех постов выбрать максимальное и минимальное значение произвольного поля, то тут способа три наверное, и как например можно использовать значения $args, которые я выше привел, тогда получается самый первый пост в цикле будет иметь максимальное, а самый последний - минимальное значение.

          • Дмитрий13 сентября 2016 в 13:09 #

            С циклом подразобрался, сейчас выводится ряд числовых значений полей (500 400 300 ...). А как мне оставить на странице первое значение (500) и убрать остальные значения?

            Я нашел сайт с примером о том, что я спрашивал про вывод макс. и мин. значений в формате от и до: http://moscow.stomatologija.su/ceny-na-uslugi . Посмотри пожалуйста. Я в этом деле начинающий, но, насколько я понял, что в ответе ты мне написал про сортировку по убыванию постов, но мне же нужно вывести на странице не сами посты,а только значение п/п у поста с мин или макс. значением.

            • Миша14 сентября 2016 в 15:09 #

              Окей, смотри, тут достаточно базовых знаний массивов, например:

              $args = array(
              	'meta_key' => 'название поля',
              	'orderby' => 'meta_value_num', // сортировать по числовому значению
              	'order'=> 'DESC' // по убыванию
              );
              $posts = get_posts( $args ); // функция get_posts() предпочтительнее так как возвращает массив постов
               
              /*
              Теперь получается, что <code>$posts</code> это массив устраивающих нас постов, по убыванию произвольного поля.
              */
              $max = get_post_meta( $posts[0]->ID, 'ключ', true );
              $number_of_elements = count( $posts ) - 1; // минус один нужен так как начинаем с нуля
              $min = get_post_meta( $posts[ $number_of_elements ]->ID, 'ключ', true );

              Как-то так :)

              • Дмитрий14 сентября 2016 в 21:09 #

                Спасибо, мастер! Твой способ работает, то, что было мне нужно! Я в мануале по php нашел функцию array_shift (извлечь первый элемент массива), но что-то не сработало как мне надо.

                • Миша14 сентября 2016 в 21:09 #

                  Пожалуйста :) Рад, что помог!

                  • Дмитрий17 сентября 2016 в 21:09 #

                    Выяснился один нюанс: заполнил нужные поля в постах, в ячейках через идет вывод мин и макс (. Определился, допустим, минимум в одном посте. Если я потом удалю число из значения п/п, то минимум больше не выводится вообще, хотя должен вывести значение от другого поста, но когда обратно указываю значение, то всё считается и минимум может быть уже в другом посте, если у него меньше, главное, чтобы ячейка была не пустая у поста, в котором первый раз был минимум. Видимо образуется какая-то привязка к первому определению значений. По ощущениям не хватает какого-то обновления в цикле. Или может можно цикл попробовать перестроить иначе?

                    • Миша18 сентября 2016 в 11:09 #

                      А, я понял, надо добавить еще проверку на пустое значение, примерно такой параметр:

                      $args = array(
                      	'meta_key' => 'название поля',
                      	'meta_compare' => 'EXISTS',
                      	'orderby' => 'meta_value_num', // сортировать по числовому значению
                      	'order'=> 'DESC' // по убыванию
                      );

                      Должно сработать.

  • Дмитрий18 сентября 2016 в 22:09 #

    Не помогло(. Странная какая-то ситуация, почему такое происходит.

    • Миша19 сентября 2016 в 15:09 #

      Там просто надо добавить отдельный meta_query на проверку, что данное поле существует, тогда не будут выводиться те, в которых оно не задано :)

      • Дмитрий19 сентября 2016 в 16:09 #

        Такую структуру пробовал, не хочет работать.

        $args = array(
        'post_type' => '***',
        'category' => **,
        'meta_key' => 'название поля,
        'orderby' => 'meta_value_num',
        'order'=> 'DESC',
        'meta_query'=> array(
        array(
        'meta_key' => 'название поля',
        'meta_compare' => 'EXISTS'
        ),
        )
        );
        $posts = get_posts( $args );
      • Дмитрий19 сентября 2016 в 16:09 #

        Теперь заработало). В meta_query немного подшаманил.

        'meta_query'=> array(
        array(
        'key' => 'название поля',
        'value' => '',
        'compare' => 'not in'
        ),
        )
        );
  • Дмитрий19 сентября 2016 в 21:09 #

    Всё благодаря вам). Миша, а направьте пожалуйста на путь, как вывести кол-во постов, которые имеют запись в определ. п/п, да так, чтобы кол-во выводилось ссылкой, кликая по которой мне отображались бы эти посты? Это как на сайте, который я приводил в качестве примера выше. Если брать из комментариев выше $number_of_elements = count( $posts ), то будет просто кол-во.

    • Миша20 сентября 2016 в 11:09 #

      Возможно мой ответ вас разочарует, но всё точно так же, то, что мы уже обсуждали + то, что в этой статье.

      Готового примера кода у меня нет, а то бы скинул его вам :)

  • Дмитрий20 сентября 2016 в 11:09 #

    так в этом случае ссылки же не будет на посты?

  • Дмитрий21 сентября 2016 в 13:09 #

    Я сделал в ячейку вывод числовых значений непустых полей заданного п/п от и до, а в ячейку рядом теперь хочу сделать вывод постов, которые поучаствовали в предыдущей выборке, в виде ссылки, например: "3 поста", кликая, происходит вывод этих 3х постов. Это как в примере по ссылке в комментарии выше #5894.

  • Дмитрий7 октября 2016 в 16:10 #

    Миша, а как задать параметры вывода постов, например, по возрастанию, но не по значениям пользовательских полей, а по расчетной переменной. Я в цикле рассчитал для каждого поста значение по формуле, теперь хочу вывести эти посты по возрастанию этого расчетного значения.

    • Миша8 октября 2016 в 14:10 #

      Самый простой вариант - заносить данные в метаполя и по ним потом сортировать. В любом случае, каждый раз делать расчет заново ресурсозатратно, я полагаю.

      Так что рассчитывать лучше не в цикле, а отдельно, заранее.

  • Дмитрий8 октября 2016 в 14:10 #

    Т.е. можно сделать расчет через функцию в functions.php или в другом месте за пределами цикла, да?
    А расчетную величину можно занести в метаполе?

    • Миша8 октября 2016 в 14:10 #

      Всё абсолютно верно.

      • Дмитрий8 октября 2016 в 14:10 #

        А чтобы сохранить расчетную переменную в метаданные в functions.php достаточно будет это прописать, указав соответствующее $meta_key и $meta_value? :

        add_post_meta($post_id, $meta_key, $meta_value, $unique);

        • Миша9 октября 2016 в 13:10 #

          Я бы рекомендовал:

          update_post_meta( $post_id, $meta_key, $meta_value );
          • Дмитрий9 октября 2016 в 22:10 #

            Почему-то не срабатывает.
            В functions.php функция, после нее ставлю эту запись (пробовал разные варианты), но метаданные эти так и не выводятся через

            get_post_meta( $post->ID, 'my_key', 1 );

            Если через глобальную переменную, то она выводится через echo, но мне нужно отсортировать по ней.
            Сортировка по глобальным переменным не возможна в принципе?

            • Миша10 октября 2016 в 14:10 #

              Нет, через глобальную не покатит.

              Я не могу знать, где у вас ошибка к сожалению :) Выгружайте сайт на тестовый хостинг и будем разбираться.

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.