我正在从事一个项目,该项目有一个名为“规程”的自定义分类法值下拉列表,下拉列表中只有4个。它的设计方式是,您可以选择多个规程进行筛选。想法是选中复选框,它将通过复选框值中指定的值过滤帖子。
我的问题是:什么是最好的方法?它不一定是AJAX,事实上,我很乐意让用户检查他们想要的值,如果他们在2秒钟左右的时间内没有检查任何内容,那么重新加载的页面和他们想要排序的值只显示符合该标准的帖子。
我在这里面临的问题是,我在哪里存储这些值,以及如何重新加载页面以使其了解这些值?我假设解决方案很可能使用query\\u var,但不确定是否还有其他方法,如使用自定义重写规则和重写标记。
This is the current code I am using to display the dropdown:
<ul class="parent-sort-container">
<li>
<?php
$disciplines = get_terms(\'discipline\', array(\'hide_empty\' => 0));
?>
<a href="#">All Disciplines</a>
<?php if ($disciplines): ?>
<ul class="filter-sub-dropdown">
<?php foreach($disciplines AS $discipline): ?>
<li><a href="javascript:void(0);"><input type="checkbox" name="discipline[]" value="<?php echo $discipline->slug; ?>"><?php echo $discipline->name; ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</li>
The generated HTML output looks like this:
<ul class="parent-sort-container">
<li>
<a href="#">All Disciplines</a>
<ul class="filter-sub-dropdown">
<li><a href="javascript:void(0);"><input type="checkbox" name="discipline[]" value="better-living">Better Living</a></li>
<li><a href="javascript:void(0);"><input type="checkbox" name="discipline[]" value="communication">Communication</a></li>
<li><a href="javascript:void(0);"><input type="checkbox" name="discipline[]" value="design-thinking">Design Thinking</a></li>
<li><a href="javascript:void(0);"><input type="checkbox" name="discipline[]" value="fashion">Fashion</a></li>
<li><a href="javascript:void(0);"><input type="checkbox" name="discipline[]" value="public-places">Public Places</a></li>
</ul>
</li>
</ul>
最合适的回答,由SO网友:onetrickpony 整理而成
将整个内容包装在表单中,并在其中添加提交按钮:
<form method="POST" action="">
<ul class="filter-sub-dropdown">
...
</form>
使用术语ID作为复选框值,而不是slug(这样可以节省一些服务器资源):
$discipline->slug;
> $discipline->term_id
然后,在您的函数中。php文件检查该表单是否已提交,并将WP的查询更改为仅包括至少包含以下术语之一的帖子:
add_action(\'pre_get_posts\', function($query){
// only do this if we have user input and if this is the main query
if(isset($_POST[\'discipline\']) && $query->is_main_query()){
// sanitize
$disciplines = array_map(\'intval\', $_POST[\'discipline\']);
// prepare a taxonomy query
$my_tax_query = array(
\'taxonomy\' => \'discipline\',
\'field\' => \'id\',
\'terms\' => $disciplines,
\'operator\' => \'IN\',
);
// include it in the main query
$query->set(\'tax_query\', array($my_tax_query));
}
});
添加AJAX支持非常简单。只需在
form submit event (使用
preventDefault()
防止其提交)(或在输入上
change 事件(如果您不想使用“提交”按钮),
serialize 在变量中输入值,执行
$.ajax
POST请求,在其中传递该变量并从响应中获取带有POST的DIV的内容。并用它替换现有内容。。。