Arhn - архитектура программирования

Динамически фильтровать сообщения Wordpress с помощью выпадающего меню (используя php и ajax)

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

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

<?php query_posts("cat=3&monthnum=12&year=2011"); ?> <?php if (have_posts()) : ?>
     <ul>
    <?php while (have_posts()) : the_post(); ?>
        <li>
           <?php the_title(); ?>
           <?php the_excerpt(); ?>
        </li>
    <?php endwhile; ?>
     </ul><?php endif; ?>

Это работает хорошо, но я хотел бы сделать страницу динамической, чтобы посетитель мог выбрать месяц и год из раскрывающегося меню и изменить содержимое в соответствии с выбранными значениями. Я разместил фотографии того, как это будет работать здесь: Fivepotato.com/images/ex1.png и Fivepotato.com/images/ex2.png.

Чтобы это сработало, я знаю, что мне нужно будет сделать значение monthnum переменной (которая берется из выпадающего списка:

<?php $monthvar = $_POST["month"]; query_posts("cat=3&monthnum=$monthvar&year=2011");?>

У меня нет большого опыта работы с Ajax, но я предполагаю, что мне нужно будет использовать его, чтобы сделать повторную фильтрацию контента раз в месяц, выбираемую из раскрывающегося меню.

Я нашел похожие запросы на следующем сайте: askthecssguy.com/2009/03/checkbox_filters_with_jquery_1.html.

И я нашел рабочий пример, похожий на то, что я хотел бы сделать по адресу:

Если бы кто-нибудь мог помочь мне с javascript/Ajax, необходимым для этого, я был бы очень признателен.


Ответы:


1

Почти 1000 просмотров и ни одного комментария. Ну мне тоже это было нужно и я решил сделать. Я поделился приведенным ниже кодом JavaScript и Wordpress для людей в отдаленном будущем. Это выглядит много, но это потому, что я определил некоторые функции jQuery, которые вы можете использовать позже с .extend. Все, что он делает, это ищет элемент select (раскрывающийся список) с классом CSS .content-filter.

После обнаружения он использует идентификатор раскрывающегося списка, чтобы установить для переменной GET значение, выбранное в данный момент, затем он перенаправляет на тот же URL-адрес и добавляет эти переменные GET. Например, если идентификатор раскрывающегося списка был product_filter, а для него установлено значение date, тогда переменная GET будет установлена ​​product_filter=date. Это здорово, потому что ему не нужны ваши детали Wordpess — все, что ему нужно, это элемент select.

// A bunch of helper methods for reading GET variables etc from the URL
jQuery.extend({
    urlGetVars : function() {
        var GET = {};
        var tempGET = location.search;
        tempGET = tempGET.replace('?', '').split('&');
        for(var i in tempGET) {
            var someVar = tempGET[i].split('=');
            if (someVar.length == 2) {
                GET[someVar[0]] = someVar[1];
            }
        }
        return GET;
    },
    urlGetVar : function(name) {
        return $.urlGetVars()[name];
    },
    serializeUrlVars : function(obj) {
        var str = [];
        for(var p in obj)
         str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
        return str.join("&");
    },
    currentUrl : function() {
        return window.location.href.slice(0,window.location.href.indexOf('?'));
    }
});

// Adds functionality to filter content using a dropdown
var ContentFilter = function ($) {
    $(document).ready(function() {
        // Return to a scroll position if exists
        var scroll = $.urlGetVar('scroll');
        if (typeof scroll != 'undefined') {
            $(window).scrollTop(scroll);
        }
        // Prepare the filter dropdowns
        $('.content-filter').each(function(){
            var me = $(this);
            // e.g. content-filter-product
            var id = me.attr('id');
            // Refresh with selected filter on change
            var refresh = function() {
                var GET = $.urlGetVars();
                GET[id] = me.val();
                // Save scroll position, return to this position on load
                GET['scroll'] = $(window).scrollTop();
                var newVar = $.currentUrl() + '?' + $.serializeUrlVars(GET);
                window.location = newVar;
            };
            me.change(refresh);
        });
    });
}(jQuery);

Теперь код Wordpress. Все, что нам действительно нужно, это сгенерировать select с каким-то идентификатором и установить класс .content-filter. Этот код запрашивает тип сообщения, такой как «сообщение» или «продукт», и делает элемент выбора. Затем для удобства возвращается переменная GET, и если она не установлена, по умолчанию используется «самая новая». Обратите внимание, что массив $fields устанавливает все различные значения порядка, которые вы хотели бы поддерживать. Вы всегда можете получить к нему доступ в любом месте шаблона с помощью $_GET['product_filter'] или $_GET['post_filter'] в зависимости от вашего типа. Это означает, что на любой данной странице может существовать только один, но вы этого хотите, иначе jQuery не будет знать, какой из них использовать. Вы можете расширить этот код, чтобы установить собственный идентификатор или что угодно позже.

function ak_content_filter($post_type_id = 'post', &$filter_get_value, $echo = TRUE) {
    $dropdown = '<div class="content-filter-wrapper">';
    // The dropdown filter id for this post type
    $filter_id = $post_type_id.'_filter';
    // The actual dropdown
    $dropdown .= '<label for="'. $filter_id .'">Filter</label><select id="'. $filter_id .'" class="content-filter" name="'. $filter_id .'">';
    // The available ways of filtering, to sort you'd need to set that in the WP_Query later
    $fields = array('date' => 'Newest', 'comment_count' => 'Most Popular', 'rand' => 'Random');
    $filter_get_value = isset($_GET[$filter_id]) ? $_GET[$filter_id] : 'newest'; // default is 'newest'
    foreach ($fields as $field_value=>$field_name) {
        $dropdown .= '<option value="'. $field_value .'" '. selected($field_value, $filter_get_value, FALSE) .'>'. $field_name .'</option>';
    }
    $dropdown .= '</select></div>';
    // Print or return
    if ($echo) {
        echo $dropdown;
    } else {
        return $dropdown;
    }
}

Теперь самое интересное — собрать все воедино на странице контента. Вся наша работа окупается приятным и коротким кодом:

// This will fill $product_filter with $_GET['product_filter'] or 'newest' if it doesn't exist
ak_content_filter('product', $product_filter);
$args = array('post_type' => 'product', 'orderby' => $product_filter);
// This is just an example, you can use get_pages or whatever supports orderby
$loop = new WP_Query( $args );

// OR, to avoid printing:
$dropdown = ak_content_filter('product', $product_filter, FALSE);
// ... some code ...
echo $dropdown;

Я использовал пользовательский тип сообщения «продукт», но если вы используете «сообщение», просто замените его. Кто-то, вероятно, должен превратить это в плагин, если он еще этого не сделал: P

20.03.2012
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..