joakim
  • 0
Новичок

query_posts -> использование meta_compare / где мета-значение меньше или больше или равно

  • 0

Я использую query_posts( $args ) для фильтрации Loop. Я хочу фильтровать сообщения на основе их meta_value «голосования», иногда меньше, иногда равно и так далее….

Я определенно хочу использовать эту query_posts() функцию и передать свой фильтр $args ! Я не хочу использовать, add_filter('posts_where', 'filter_where'); а затем добавлять AND оператор в запрос.

Я хочу использовать данную функциональность WordPress для фильтрации сообщений с помощью и meta_key вот так:meta_value meta_compare

$args = array( 'meta_key'=>'vote', 'meta_compare'=>'>=', 'meta_value'=>5, 'posts_per_page'=>100 ) )

query_posts( $args );

Результатом этого является:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND wp_postmeta.meta_key = 'vote' AND wp_postmeta.meta_value >= '5' GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 100

Проблема в том, что:

wp_postmeta.meta_value >= '5' 

Так должно быть:

wp_postmeta.meta_value >= 5

Тогда это будет работать нормально.

Я не понимаю, почему WordPress добавляет кавычки.

Я использую предопределенный параметр из WordPress ( <, >, <=, >= ), и очевидно, что он будет работать только с числами, а не со строками, которые должны быть в кавычках.

В документации говорится:

Возвращает сообщения с ключом настраиваемого поля «мили» со значением настраиваемого поля МЕНЬШЕ ИЛИ РАВНО 22

query_posts('meta_key=miles&meta_compare=<=&meta_value=22');

Share
  1. Начиная с WP 3.1, вы можете преобразовать мета-значение во что угодно, используя аргумент «type» в «meta_query»:

    $args = array(
      'meta_query'=> array(
        array(
          'key' => 'vote',
          'compare' => '>=',
          'value' => 5,
          'type' => 'numeric',
        )
      )
      'posts_per_page' => 100
    ) );
    
    query_posts( $args );
    
    • 0
  2. Судя по быстрому просмотру документации meta_value, она предназначена для строк, а для числовых значений существует meta_value_num .

    См . параметры заказа по

    Обновлять

    Покопался.

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

    Проблема в том, что WP_Query правильно получает число как int (передача как массив не имеет значения), но пропускает сгенерированное meta_compare условие $wpdb->prepare() и явно помечает значение как %s строку. В этом случае prepare принудительно заключайте его в одинарные кавычки.

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

    • 0
  3. Я бы рекомендовал проанализировать ваш $args массив и преобразовать его в строку, прежде чем передавать его в query_posts . Когда вы создаете $args массив, система автоматически преобразует число 5 в строку «5», когда массив снова превращается в строку.

    Поэтому используйте это вместо этого:

    query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100');
    

    Это по-прежнему передает ту же информацию в query_posts, но должно передавать число 5, а не строку «5».


    Обновлять

    Так как теперь мы обнаружили, что meta_value хранит строки, а не числа, и вы не можете эффективно выполнять сравнение больше/меньше чем со строками. Однако после некоторых исследований я наткнулся на флаг запроса meta_value_num .

    Если вы выполните следующий query_posts вызов:

    query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100&orderby=meta_value_num');
    

    Тогда вы должны получить желаемое поведение. meta_value_num говорит WordPress оценивать ваши meta_value s как числа, а не строки.

    • 0

Оставить ответ

You must login to add an answer.