使用复选框通过自定义分类值对帖子进行排序?

时间:2012-05-16 作者:Dwayne Charrington

我正在从事一个项目,该项目有一个名为“规程”的自定义分类法值下拉列表,下拉列表中只有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>

1 个回复
最合适的回答,由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的内容。并用它替换现有内容。。。

结束

相关推荐

Sort plugins by rating

当我想安装一个新的Wordpress插件时,我会搜索我想要的插件,并收到一个结果列表。有没有办法按评级或名称对结果进行排序?如果没有,它将是Wordpress的一个有用的补充。