Intereting Posts
WP :: is_main_query () Не работает Paginate вложенный запрос дочерних сообщений Правильное форматирование post_date для wp_insert_post? установить новую ссылку как permalink Как отображать комментарии и форму комментариев в пользовательском типе сообщений? Использование нескольких переменных внутри функции? Насколько важно вставить в таблицу стилей темы? Создание структуры меню, совпадающей с иерархической страницей страницы, на странице parent change Когда использовать инструкцию if после get_posts? Любые хорошие темы WordPress, совместимые с плагином BBPress? Несколько сообщений / страниц на одной странице? Обработка цвета текста логотипа из раздела admin php включает возврат 1 после содержимого Добавить форму кода доступа для вызова уникальной страницы на странице без регистрации Современный календарь Tribe Календарь wp-запрос с мета-запросом не работает вообще

Создать список архивов на основе мета-массива

У меня есть пользовательский тип сообщения «событие», а для даты события используется мета-поле. Я успешно создал архивные страницы (год и месяц), основываясь на ответе на предыдущий вопрос ( здесь ). Теперь я пытаюсь создать список архивов, вроде wp_get_archives. Пример:

2012

  • январь
  • февраль
  • Март
  • и т.д

2011

  • январь
  • февраль
  • Март
  • и т.д

Запрос, который я запускаю, чтобы собрать все даты из meta_key, таков:

$query = $wpdb->get_col( "SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = 'event_date' ORDER BY meta_value DESC" ); 

Но я не уверен, как я могу взять эти данные и перечислить их, как в приведенном выше примере. Я знаю, что могу выводить уникальные даты, как и для цикла foreach. Это, мой результат выглядит следующим образом:

2012-07-15 2011-06-07 2011-01-10

Пытаясь все это отсортировать в формате списка, я совершенно не уверен. Любая помощь с этим очень ценится!

Вы посмотрели на функцию даты PHP?

Быстрый пример:

  $dates = $wpdb->get_col( /*your sql*/ ); if( $dates ) { $archive_year = ""; foreach( $dates as $date ) { $the_date = strtotime( $date ); $year = date( 'Y', $the_date ); //4 digit year, ex 1999 $month = date( 'F', $the_date ); //Full textual month, ex January if( $year != $archive_year ) { if( !empty( $archive_year ) ) echo "</ul>"; echo " <h2>$year</h2> <ul> <li>$month</li> "; } else { echo "<li>$month</li>"; } } } 

Второй пример

  $dates = $wpdb->get_col( /*your sql*/ ); if( $dates ) { $archive_year = date( 'Y' ); //Get current year echo "<h2>$archive_year</h2>"; echo "<ul>"; foreach( $dates as $date ) { $the_date = strtotime( $date ); $year = date( 'Y', $the_date ); //4 digit year, ex 1999 $month = date( 'F', $the_date ); //Full textual month, ex January if( $year == $archive_year ) { echo "<li>$month</li>"; } } echo "</ul>"; } 
 $query = ' SELECT YEAR(meta_value) as `year`, MONTH(meta_value) as `month`, COUNT(DISTINCT post_id) as `posts` FROM '.$wpdb->postmeta.' WHERE meta_key = "event_date" ORDER BY meta_value DESC'; $results = $wpdb->get_results( $query ); 

Это должно быть довольно солидным началом, возможно, вам придется настроить его, и вы можете захотеть сделать JOIN для получения post_status и т. Д., Чтобы не создавать черновики и что нет (хотя вы могли бы сделать это в PHP если вам это нравится, в любом случае, я думаю, что SQL, вероятно, будет более эффективным, хотя). Моя единственная проблема заключается в том, что MySQL, возможно, не хочет возвращать YEAR из типа не-datetime … и если это не сработает, вам придется пойти с PHP-решением, например, с Shane's.