Intereting Posts
Обновление пользовательских полей профиля Как сделать загрузку стиля style.css дочерней темы после плагина css? Форсировать форму поиска, чтобы перейти на чистый URL-адрес без нескольких переадресаций Создание ссылки WP_Delete_user Как удалить нежелательный раздел на странице профиля только для пользователей? Предотвратить добавление / создание новых страниц Элементы меню внезапно отображаются на всей странице Загрузите get_page_templates в меню выбора $ wpdb-> подготовить ошибку после обновления WordPress Я пытаюсь создать поле вопроса безопасности для моей страницы входа Показать название таксономии Зачем использовать admin-ajax.php при загрузке страниц через AJAX? jQuery Ajax () не работает, когда страница доступна как страница шаблона WordPress В архиве категорий отображаются все сообщения, а не определенная категория wp_enqueue_scripts не работает для страниц шаблонов

Количество должностей за каждый год

Я использую следующий код, чтобы перечислять все годы из моего блога, я думаю, мы можем назвать его архивом.

<?php $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY post_date DESC"); foreach($years as $year) : ?> <?php echo $year ?> <?php endforeach; ?> 

То, что я хотел бы достичь, – это также показывать перед каждым годом количество сообщений (количество), которое каждый год имеет. Пример:

 2015 (5 posts) 2014 (3 posts) 2011 (10 posts) 

Я где-то нашел подсказку и попытался ее реализовать, но не работал. Вот что я пытался:

 <?php $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY post_date DESC"); $count = $years->post_count; foreach($years as $year) : ?> <?php echo $year ?> (<?php echo $count ?> posts) <?php endforeach; ?> 

Есть идеи?

Спасибо.

EDIT @David

 <?php /** Grab the years that contain published posts, and a count of how many */ $query = $wpdb->prepare(' SELECT YEAR(%1$s.post_date) AS `year`, count(%1$s.ID) as `posts` FROM %1$s WHERE %1$s.post_type IN ("post") AND %1$s.post_status IN ("publish") GROUP BY YEAR(%1$s.post_date) ORDER BY %1$s.post_date DESC', $wpdb->posts ); $results = $wpdb->get_results($query); /** Create the '$years' array, a list of all yearly archives */ $years = array(); if(!empty($results)) : foreach($results as $result) : $url = get_year_link($result->year); // The archive link URL for the current year $text = $result->year; // The archive link text for the current year $count = $result->posts; // The number of posts in the current year $years[] = get_archives_link($url, $text, 'html', '', $count); // Create the archive link for the current year endforeach; endif; ?> <a href="<?php echo $url; ?>"><li><?php echo $text ?> <span class="lower">(<?php echo $count ?>)</span></li></a> 

Легкий путь

Это далеко и далеко самый простой подход к этому, но если вы не хотите быть немного гибким с тем, как вы представляете свой архив, это не для вас.

wp_get_archives() решение достигается с помощью функции wp_get_archives() . К сожалению, хотя для управления выходом нет фильтра, поэтому у вас будет список, подобный этому. Счет не будет частью ссылки –

2015 (5)
2014 (3)
2011 (10)

И вот код –

 $args = array( 'type' => 'yearly', 'show_post_count' => true ); wp_get_archives($args); 

Трудный путь

Поэтому, если вы решите, что простой способ не для вас, вы оставите трудный путь. По сути, мы реплицируем функциональность wp_get_archives() , но вы можете форматировать вывод точно так, как хотите.

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

Выходные данные оставят вас со списком, отформатированным по мере того, как вы разместили в обновлении свой вопрос. Счет будет частью ссылки –

2015 (5)
2014 (3)
2011 (10)

И вот код –

 /** Grab the years that contain published posts, and a count of how many */ $query = $wpdb->prepare(' SELECT YEAR(%1$s.post_date) AS `year`, count(%1$s.ID) as `posts` FROM %1$s WHERE %1$s.post_type IN ("post") AND %1$s.post_status IN ("publish") GROUP BY YEAR(%1$s.post_date) ORDER BY %1$s.post_date', $wpdb->posts ); $results = $wpdb->get_results($query); /** Create the '$years' array, a list of all yearly archives */ $years = array(); if(!empty($results)) : foreach($results as $result) : $count = '<span class="lower">(' . $result->posts . ')</span>'; // The number of posts in the current year $url = get_year_link($result->year); // The archive link URL for the current year $text = '<li>' . $result->year . ' ' . $count . '</li>'; // The archive link text for the current year $years[] = get_archives_link($url, $text, 'html'); // Create the archive link for the current year endforeach; endif; /** Output the custom archive list */ echo join("\n", $years); 

редактировать

Основываясь на вашем комментарии, я немного изменил свой ответ.

Причина, по которой вы могли вывести только один год, – это то, что вы были всего лишь экспликацией, повторяющейся в прошлом году после цикла foreach . Что делает код, каждый год добавляется в массив $years , а затем выводит все из них, используя финальную строку – echo join («\ n», $ years);

У меня была просто проблема, и потому, что я не чувствую себя комфортно с выполнением запросов БД в обработанных php-сайтах, я сделал эту функцию, witch использует wp_get_archives () и regex. Он возвращает массив с годом в качестве ключа и количества сообщений в качестве значения.

Средний путь:

 function load_years() { $args = array( 'type' => 'yearly', 'show_post_count' => true ); ob_start(); wp_get_archives($args); $item = ob_get_contents(); ob_end_clean(); $pattern = '/\'>(\d\d\d\d)<.*nbsp;\((\d*)/'; preg_match_all($pattern, $item, $matches, PREG_OFFSET_CAPTURE); $years_array = array(); foreach ($matches[1] as $key => $value) { $year = $matches[1][$key][0]; $posts = $matches[2][$key][0]; $years_array[$year] = $posts; } return $years_array; }