如何使用复选框创建帖子类别过滤器?

时间:2019-05-15 12:38:56

标签: php jquery html css wordpress

在我的博客存档页面上,我试图使用复选框创建类别过滤器,以便访问者可以按类别过滤帖子,而无需重新加载页面。 但是我被困在如何隐藏未选中类别的项目中。

我写了一段代码,但是真的不知道该怎么做。

$('.category-filter input[type="checkbox"]').click(function() {
  if ($(this).is(":checked")) {
    var categoryName = $(this).attr("name");

    if ($("article").hasClass('category' + categoryName)) {}
    $(this).toggle;
  } else if ($(this).is(":not(:checked)")) {

  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<aside class="category-filter">
  <label class="filter-category"><input type="checkbox" value="7" name="block" class=" js-filter-checkbox" id="7">Block</label>
  <label class="filter-category"><input type="checkbox" value="16" name="classic" class=" js-filter-checkbox" id="16">Classic</label>
  <label class="filter-category"><input type="checkbox" value="22" name="edge-case-2" class=" js-filter-checkbox" id="22">Edge Case</label>
</aside>

<main>
  <article id="post-2131" class="post-2131 post type-post status-publish format-standard has-post-thumbnail sticky hentry category-geen-onderdeel-van-een-categorie"></article>
  <article id="post-1241" class="post-1241 post type-post status-publish format-standard sticky hentry category-classic category-uncategorized tag-sticky-2 tag-template"></article>
  <article id="post-1938" class="post-1938 post type-post status-publish format-standard hentry category-block"></article>
</main>

我想隐藏没有任何已检查类的文章。

3 个答案:

答案 0 :(得分:0)

我可以想到两种解决方案。第一种是在过滤器更改时使用AJAX重新加载结果列表。

第二个选项(看起来像您要尝试的选项)是将数据属性中每个帖子的类别添加到元素(以逗号分隔),并且当过滤器更改时,循环遍历每个帖子元素并检查类别是否存在,然后隐藏或显示每个post元素。

这两个选项之间的选择取决于您显示的项目数量以及是否使用分页。第二种选择是最简单的一种,但是使用分页时会给您带来麻烦,因为并非所有帖子都会一次加载。

答案 1 :(得分:0)

$('.category-filter').on('change', function(){
    $('main article').hide();
  $.each($('.category-filter input[type="checkbox"]'), function(el){
    if ($(this).is(":checked")) {
            var categoryName = $(this).attr("name");
      $("article.category-"+categoryName).show();
    }
  });
});

答案 2 :(得分:0)

这需要使用AJAX完成。创建此AJAX过滤器将需要几个步骤。

首先,如果您一次只能单击复选框,则需要确保所有人具有相同的名称属性值。因此,您应该将它们都称为name =“ category-checkbox”,而不是name =“ block”或name =“ classic”。

在functions.php文件中,需要排队以下内容:

function scripts() {
     wp_localize_script ('scripts', 'js_variables', array ('js_home_url' => 
     home_url(), 'ajaxURL' => admin_url( 'admin-ajax.php' ), ''));
}
add_action( 'wp_enqueue_scripts', 'scripts' );

在您的javascript文件中,您需要从复选框中收集数据。您可以执行以下操作:

$('.filter-category').change(function() {
  var catId = ($(this).val());
  aJaxFilter(catId);
});

function aJaxFilter(formData) {
  $.ajax({
    url: js_variables.ajaxURL,
    type:'GET',
    data: {
      'formData' : formData,
      'action' : 'listFilteredProducts'
    },
    success:function(data){
      $('main').html(data);
    }
  });
}

然后,您需要制作另一个文件,我将其命名为ajax-function.php,并将其放在我的代码片段文件夹中。在其中输入以下代码:

add_action('wp_ajax_listFilteredProducts', 'listFilteredProducts');
add_action('wp_ajax_nopriv_listFilteredProducts', 'listFilteredProducts');

function listFilteredProducts($wp_query) {
  if(isset($_GET['formData'])) {
    $cat_id = $_GET['formData'];
  }
  $args = array(
  'post_type' => 'post',
  'posts_per_page' => -1,
  'cat' => $cat_id,
  );
  $multiple = get_posts($args);
  foreach($multiple as $single) {
  $ID = $single->ID;
   // Put the code for how you want your article cards to look here.
  }
  wp_die();
}