Отображение выпадающего списка “Месяц” для фильтрации сообщений на внешнем интерфейсе, как в панели управления WordPress.

Вопрос или проблема

когда я запускаю следующий код.

$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, вы можете использовать функцию 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-запросы.

Шаги по реализации:

  1. Извлечение архивов через wp_get_archives:
    Используйте функцию wp_get_archives() с параметрами, аналогичными тем, что вы указали в коде, и настройте ее вывод с помощью фильтра get_archives_link для изменения HTML-ссылок в желаемый вид.

  2. Применение фильтра 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');
  3. Прямая выборка из базы данных:
    Вместо использования 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-запросов позволяет создать удобное и функциональное выпадающее меню для фильтрации контента на вашем сайте. Это улучшает как пользовательский интерфейс, так и упрощает управление контентом для администраторов.

Оцените материал
Добавить комментарий

Капча загружается...