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

wordpress.stackexchange https://wordpress.stackexchange.com/questions/1014

  •  16-10-2019
  •  | 
  •  

Вопрос

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

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

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

<?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

Это было полезно?

Решение

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

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

Другие советы

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

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

query_posts('meta_key=event_date'); 

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

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

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

Привет @Josh:

Ваш запрос работает нормально. Наверное, ты $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() Вместо прямого 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() Так что аргументы действительно идентичны:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top