几乎有1000次浏览,却没有一条评论。好吧,我也需要这个并决定制作它。我已经分享了JavaScript和WordPress代码供将来的人使用。看起来很多,但那是因为我定义了一些jQuery函数,您可以稍后使用
.extend
。它所做的就是查找带有CSS类
.content-filter
的
select
元素(下拉菜单)。
一旦找到,它就使用下拉菜单的id将一个GET变量设置为当前选择的值,然后重定向到相同的URL并添加这些GET变量。例如,如果下拉列表的id是product_filter
,并且其设置了一个值为date
,则它会设置GET变量product_filter = date
。这很棒,因为它不关心您的Wordpess详细信息 - 它只关心select
元素。
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('?'));
}
});
var ContentFilter = function ($) {
$(document).ready(function() {
var scroll = $.urlGetVar('scroll');
if (typeof scroll != 'undefined') {
$(window).scrollTop(scroll);
}
$('.content-filter').each(function(){
var me = $(this);
var id = me.attr('id');
var refresh = function() {
var GET = $.urlGetVars();
GET[id] = me.val();
GET['scroll'] = $(window).scrollTop();
var newVar = $.currentUrl() + '?' + $.serializeUrlVars(GET);
window.location = newVar;
};
me.change(refresh);
});
});
}(jQuery);
现在是 Wordpress 代码部分。我们只需要生成一个带有某种 ID 的
select
,并将类设置为
.content-filter
。此代码请求像“post”或“product”这样的文章类型,并创建选择元素。然后它返回 GET 变量以方便使用,如果没有设置,则默认为“newest”。请注意,
$fields
数组设置了您想支持的所有不同
orderby values。您始终可以在模板中的任何位置使用
$_GET['product_filter']
或
$_GET['post_filter']
来访问它,具体取决于您的类型。这意味着在任何给定页面上只能存在一个,但您希望如此-否则 jQuery 将不知道要使用哪个。您可以稍后扩展此代码以设置自定义 ID 或其他任何内容。
function ak_content_filter($post_type_id = 'post', &$filter_get_value, $echo = TRUE) {
$dropdown = '<div class="content-filter-wrapper">';
$filter_id = $post_type_id.'_filter';
$dropdown .= '<label for="'. $filter_id .'">Filter</label><select id="'. $filter_id .'" class="content-filter" name="'. $filter_id .'">';
$fields = array('date' => 'Newest', 'comment_count' => 'Most Popular', 'rand' => 'Random');
$filter_get_value = isset($_GET[$filter_id]) ? $_GET[$filter_id] : '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>';
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