Intereting Posts
Как перемещаться по категории? Много кодов здесь на stackexchange не работало проблема с кодировкой с новой пользовательской таблицей Могу ли я установить новый сайт WordPress в подкаталог существующего сайта WordPress? Как использовать многоязычный WordPress со смешанными HTTP и HTTPS-сайтами? Список конкретных категорий из текущего сообщения с глубиной Как отображать сообщения из двух таксономий? Как редактировать сообщение WordPress без повторной публикации Как исправить эти предупреждения с помощью модуля «Feed JSON»? второй признанный пост, не отображающийся на странице Что мне нужно сделать, чтобы преобразовать мой MultiSite из HTTP в HTTPS? Вывод содержимого страницы в двух местах Контент для конкретной страны WordPress SEO плагин (по Yoast) и BuddyPress Переопределить функцию родительской темы, которая не подключена или в файле functions.php Понимание поддержки типа WordPress

Сортировка сообщений 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]

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

Есть идеи?


EDIT: Вот изображение, чтобы вы могли видеть, как настраиваемые поля хранятся в базе данных. Надеюсь, это поможет вам понять, почему на земле _events_meta[event_date] не будет работать в запросе?

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

Solutions Collecting From Web of "Сортировка сообщений WordPress через пользовательские значения полей?"

Джош, посмотрите: http://farinspace.com/wpalchemy-metabox-data-storage-modes/

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

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

 query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Ym-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'); 

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

 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() вместо 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() делает это на самом деле больше того, что вы хотите в любом случае.

Документы Codex для get_posts()

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

  • get_posts() в Codex

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

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

  • query_posts() в Codex