it-swarm.xyz

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

Итак, я использую класс 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

1
Josh

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

Я думаю, что я буду изменять, как WPAlchemy хранит значения по умолчанию ... делая режим EXTRACT по умолчанию ...

0
farinspace

Я также получил блог с настраиваемыми полями относительно события. Вот запрос, который я использовал в сочетании с функцией 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 () .

2
2ndkauboy

Привет @ Джош :

Ваш запрос работает нормально. Вероятно, ваша переменная $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 рекомендуется использовать всегда использовать API WordPress, а функции запросов и никогда не используют прямой 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
MikeSchinkel