Вопрос или проблема
когда я запускаю следующий код.
$args = array( 'type' => 'monthly', 'limit' => '', 'format' => 'option', 'before' => '', 'after' => '', 'show_post_count' => false, 'echo' => 1, 'order' => 'DESC', 'post_type' => 'post' )
<select>
<option value=""> Select </option>
<?php
wp_get_archives( $args );
?> </select>
Я получил такой вывод
<select>
<option> Select </option>
<option value="http://test.astech-us.com/holistichivorce/2016/03/"> March 2016 </option>
<option value="http://test.astech-us.com/holistichivorce/2016/02/"> February 2016 </option></select>
но мне нужен вывод, как в фильтре на бэкенде WordPress. вот так
<select name="m" id="filter-by-date"><option selected="selected" value="0">All dates</option><option value="201603">March 2016</option><option value="201602">February 2016</option></select>
Спасибо,
wp_get_archives
создает свои ссылки с помощью функции get_archives_link
. Эта функция возвращает простой HTML, но у нее есть фильтр, к которому вы можете подключиться.
Вы можете использовать фильтр get_archives_link
для манипуляции вашим HTML с помощью некоторого regex.
function my_archives_link($link_html) {
//TODO: мой regex для манипуляции HTML
return $link_html;
}
add_filter('get_archives_link','my_archives_link')
Дополнительное чтение
- wp_get_archives
- get_archives_link
- Фильтр Hook: get_archives_link
Чтобы создать выпадающий фильтр для публикаций по месяцам на интерфейсе, аналогичный бэкенду wp, вы можете использовать функцию wp_dropdown_categories()
с пользовательским запросом таксономии, чтобы достичь желаемого результата
<select name="filter-by-date" id="filter-by-date">
<option selected="selected" value="0">All dates</option>
<?php
global $wpdb;
$months = $wpdb->get_results("
SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month
FROM $wpdb->posts
WHERE post_type="post" AND post_status="publish"
ORDER BY post_date DESC
");
foreach ($months as $month) {
$value = sprintf("%04d%02d", $month->year, $month->month);
$label = date("F Y", strtotime($month->year . '-' . $month->month . '-01'));
echo "<option value="$value">$label</option>";
}
?>
</select>
Ответ или решение
Чтобы создать на фронтенде выпадающее меню для фильтрации постов по месяцам, аналогичное фильтру в бэкэнде WordPress, вы можете использовать функции WordPress для извлечения данных о публикациях и динамического формирования HTML-кода. В этом случае, для достижения нужного результата, можно воспользоваться функцией wp_get_archives()
с модификацией вывода через фильтры, а также извлечением данных напрямую через MySQL-запросы.
Шаги по реализации:
-
Извлечение архивов через wp_get_archives:
Используйте функциюwp_get_archives()
с параметрами, аналогичными тем, что вы указали в коде, и настройте ее вывод с помощью фильтраget_archives_link
для изменения HTML-ссылок в желаемый вид. -
Применение фильтра get_archives_link:
Код фильтра настройки вывода HTML:function my_custom_archives_link($link_html) { // Пример обработки ссылки для получения желаемого формата: if (preg_match('/<a href="([^"]+)">(.+)\s(\d+)<\/a>/', $link_html, $matches)) { $year = $matches[3]; $month = date('m', strtotime($matches[2])); $value = $year . $month; return "<option value=\"$value\">{$matches[2]} $year</option>"; } return $link_html; } add_filter('get_archives_link', 'my_custom_archives_link');
-
Прямая выборка из базы данных:
Вместо использованияwp_get_archives()
, можно сделать прямой SQL-запрос для создания похожей выборки, что обеспечивает большую гибкость.global $wpdb; $months = $wpdb->get_results(" SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month FROM $wpdb->posts WHERE post_type='post' AND post_status='publish' ORDER BY post_date DESC "); echo '<select name="filter-by-date" id="filter-by-date">'; echo '<option selected="selected" value="0">All dates</option>'; foreach ($months as $month) { $value = sprintf('%04d%02d', $month->year, $month->month); $label = date('F Y', strtotime($month->year . '-' . $month->month . '-01')); echo "<option value=\"$value\">$label</option>"; } echo '</select>';
Преимущества:
- Гибкость: Дает возможность динамически управлять форматом выводимых решений.
- Производительность: Оба метода обеспечивают оптимизированный доступ и вывод данных.
- Пользовательский опыт: Позволяет пользователям легко фильтровать контент по месяцам, улучшая навигацию.
Подведение итогов:
Эффективное использование стандартных функций WordPress и MySQL-запросов позволяет создать удобное и функциональное выпадающее меню для фильтрации контента на вашем сайте. Это улучшает как пользовательский интерфейс, так и упрощает управление контентом для администраторов.