josh
  • 0
Новичок

Сортировка записей WordPress по значениям настраиваемых полей?

  • 0

Итак, я использую класс WPAlchemy для создания панелей записи настраиваемых полей на странице записи сообщений, и пока все прошло отлично… Однако есть одна проблема, которую я не могу понять. Я пытаюсь использовать значения настраиваемого поля «даты событий» для сортировки событий в пользовательском шаблоне страницы.

Я следовал инструкциям «Запрос на основе настраиваемого поля и сортировки по значению», найденным в кодексе, чтобы попытаться настроить пользовательский запрос, но, похоже, он не работает?

Вот код из пользовательского шаблона страницы для страницы « События »:

<?php
/* 
  Template Name: Events
*/
get_header();
?>
<div id="depthead" class="grid_12">
  <h2>Upcoming Events</h2>
</div><!--/depthead-->
<?php

$querystr = "
  SELECT wposts.* 
  FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
  WHERE wposts.ID = wpostmeta.post_id 
  AND wpostmeta.meta_key = '_events_meta[event_date]' 
  AND wposts.post_type = 'post'

  ORDER BY wpostmeta.meta_value DESC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);

?>
<?php if ($pageposts): global $post; $cnt=0; foreach ($pageposts as $post): $cnt++; setup_postdata($post); ?>
<div id="article-<?php echo get_the_ID(); ?>" class="listingbox grid_3">
  <div class="deptpostimg">
    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><img src="<?php echo $events_metabox->get_the_value('event_thumbnail'); ?>" style="outline:1px solid #000" alt="<?php the_title_attribute(); ?>" /><span class="event-date"><?php $events_metabox->the_value('event_date'); ?></span></a>
  </div><!--/deptpostimg-->
  <h4 class="listing-titles"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h4>
  <div class="excerpt">
    <?php the_excerpt(); ?>
  </div><!--/excerpt-->
</div><!--/article-<?php echo get_the_ID(); ?>-->
<?php if($cnt % 4 == 0) { ?>
<div class="grid_12 rowseparator">
  <hr />
</div><!--/rowseparator-->
<?php } ?>
<?php endforeach; endif; ?>
</div><!--/wrapper-->
<?php get_footer(); ?>

Это похоже на то, что он не подбирает ключи настраиваемого поля… Класс, который я использую для создания этих настраиваемых панелей записи, хранит их все в виде массива, поэтому я пытался получить к ним доступ, используя:_events_meta[event_date]

Может проблема в этом, но я не знаю, как это исправить, если это так…

Есть идеи?


РЕДАКТИРОВАТЬ: Вот изображение, чтобы вы могли видеть, как настраиваемые поля хранятся в базе данных. Надеюсь, это поможет вам понять, почему _events_meta[event_date] запрос не работает?

Снимок экрана PHPMyAdmin с запросом на вставку для базы данных WordPress http://staticloader.com/phpmyadmin.png

Share
  1. Джош, взгляни на: http://farinspace.com/wpalchemy-metabox-data-storage-modes/

    Я думаю, что изменю то, как WPAlchemy хранит значения по умолчанию… установив режим EXTRACT по умолчанию…

    • 0
    • Чувак, это только что спасло меня от серьезного выпадения волос… Спасибо!

      • 0
    • Проблема с этим примером заключается в том, что настраиваемое поле не называется «event_date»… Это настраиваемое поле с именем «_events_meta», которое содержит массив различных пар «ключ-значение» настраиваемого поля, таких как «event_date» и другие. Вот почему я попытался использовать _events_meta[event_date] в запросе.

      • 0
    • Я согласен, на самом деле я также предпочитаю query_posts() или get_posts()… Однако, когда я пробую что-то, чего никогда раньше не делал, я склонен придерживаться того, что говорится в документации, пока лучше не пойму, как оно работает. Однако при использовании: $pageposts = get_posts('meta_key=_events_meta[event_date]&orderby=meta_value&order=ASC'); print_r($pageposts); все, что возвращается, это «Array()» — Odd. Кроме того, $events_metabox объявлен как глобальный в верхней части страницы.

      • 0
    • Таким образом, пустой массив заставляет меня еще больше поверить, что он должен иметь какое-то отношение к ключу пользовательского поля, который не распознается в запросе… По какой-то причине _events_meta[event_date] просто не работает, хотя это точно как данные хранятся в БД…

      • 0
    • @Josh Я скопировал и запустил ваш код, и он ничего не вывел, кроме заголовка (я практически не отвечаю здесь на вопросы, если только не протестирую код на самом деле). Это было странно. Как только я удалил строки с $events_metabox ним, он начал выводиться. Вы точно тестировали без этих строк? И как хранятся даты событий? Мета хранится так же, как и longtext в MySQL, поэтому сортировка будет работать только по YYYYMMDD формату (т . е date(DATE_ISO8601) . должна работать). Есть ли у вас плагины, которые могут влиять на ваши запросы?

      • 0
    • Спасибо за подробные объяснения… но на самом деле оказалось, что запрос не будет работать с ключами, хранящимися в виде массивов. Димас (создатель класса WPAlchemy) показал мне, где искать решение. Спасибо еще раз!

      • 0
  2. У меня также есть блог с настраиваемыми полями, касающимися события. Вот запрос, который я использовал в сочетании с функцией query_posts():

    query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')."&meta_key=event_date_start&orderby=meta_value&order=ASC");
    

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

    Простой выбор, проверяющий только наличие настраиваемого поля, выглядит так:

    query_posts('meta_key=event_date'); 
    

    Простой ORDER BY пользовательского поля выглядит так:

    query_posts('meta_key=event_date&orderby=meta_value&order=ASC');
    

    Вы можете увидеть множество примеров в описании API функции query_posts().

    • 0
  3. Привет @Джош :

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

    global $events_metabox
    

    Если это не сработает, вам придется искать проблему другим способом, так как я не знаю, что делает ваш код с $events_metabox .

    Отладка с использованием добавочного удаления иprint_r()

    Когда вы столкнетесь с такой проблемой, начните убирать кусочки, пока не решите проблему. Если вы пытаетесь увидеть, работает ли ваш запрос или нет, используйте print_r() для вывода значений, заключенных в <pre> теги, чтобы вы могли видеть, что происходит, то есть:

    <?php
    $pageposts = $wpdb->get_results($querystr, OBJECT);
    echo '<pre>';
    print_r($pageposts);
    echo '<pre>';
    

    Также используйте get_posts() вместо Direct SQL

    Тем не менее, я настоятельно рекомендую вам заменить ваш запрос get_posts() звонком. В WordPress рекомендуется всегда использовать WordPress API и его функции запросов и никогда не использовать прямой SQL, если нет абсолютно никакой возможности обойти это. Вы получаете много преимуществ, включая встроенное кэширование в некоторых случаях, они обрабатывают такие вещи, как обеспечение отображения только опубликованных сообщений, если вы не укажете иное, и с меньшей вероятностью сломается, если они изменят структуру базы данных в будущем.

    Вот get_posts() вызов, который вам понадобится для замены жестко заданного SQL-запроса (с некоторыми оговорками ):

    $pageposts = get_posts('meta_key=_events_meta[event_date]&orderby=meta_value&order=ASC');
    

    Или этот эквивалент делает то же самое:

    $pageposts = get_posts(array(
      'meta_key' => '_events_meta[event_date]',
      'orderby'  => 'meta_value',
      'order'    => 'ASC',
    ));
    

    Предостережения, которые я упомянул, заключаются в том, что ваш запрос не отфильтровывал неопубликованные, черновики и т. д.; я думаю, что get_posts() это на самом деле больше, чем вы хотели бы в любом случае.

    Документы Кодекса дляget_posts()

    Документация для get_posts() находится здесь:

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

    Во всяком случае, query_posts() на самом деле просто вызовы get_posts(), поэтому аргументы действительно идентичны:

    • 0

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

You must login to add an answer.