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

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

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

<?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

И я нашел рабочий пример, похожий на то, что я хотел бы сделать по адресу: http://www.babycarers.com/search?ajax=0&searchref=37609&start=0&lat=&lon=&city=&radius=0&spec1=1&spec2=1&spec3=1&spec4=1&spec5=1&spec6=1&spec7=1&inst1=1&inst2=1&inst3=1&inst4=1&inst5=1&inst6=1&inst7=1&minfee=any&maxfee=any&av1=1&keywords=&country=CA&sort=fee&resultsperpage=10

Если кто-нибудь может помочь мне с JavaScript / AjaxЯ бы очень признателен.

1 Ответ

9 голосов
/ 20 марта 2012

Почти 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. Этот код запрашивает тип записи, такой как «post» или «product», и создает элемент select. Затем он возвращает переменную GET для удобства, и, если ни одна из них не установлена, то по умолчанию используется «newest». Обратите внимание, что массив $fields устанавливает все различные значения orderby , которые вы хотели бы поддерживать. Вы всегда можете получить к нему доступ в любом месте шаблона с помощью $_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;

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

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