Сортировка сообщений WordPress через пользовательские значения поля?
-
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]
не будет работать в запросе?
Решение
Джош, взгляните на: 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()
Так что аргументы действительно идентичны: