我想设置一个小部件来按类别过滤我的帖子。 让我们说,我确实有两个不同的类别,“国家”和“逗留时间”与子类别。这是我的一个例子:
我想要的是按多个类别过滤帖子。因此,如果用户正在检查国家“老挝”和“2-4天”的停留时间,我想只检索“老挝”类别和类别“2-”的帖子4天“已经附上。
我尝试使用Query Multiple Taxonomies插件。但是,这种堵塞是 检索所有包含“老挝”类别的帖子以及所有长度为“2-4天”的帖子。
我知道,我可以使用此查询过滤帖子,但是,我需要一些帮助来使用提交按钮创建此小部件。此外,我想自定义它以删除父类别并将其显示为标题(删除“国家”和“逗留时长”的复选框并添加一个特定的类)?
工作查询:
<?php // cat 42=Laos cat 57=2-4Days
<?php $my_query_1 = new WP_query(array('category__and' => array(42,57))); ?>
<?php while ($my_query_1->have_posts()) : $my_query_1->the_post(); ?>
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to
<?php the_title(); ?>"><?php the_title(); ?><?php the_excerpt(); ?></a>
<?php endwhile; ?>
感谢您的帮助
我做了什么:
我创建了这个新侧栏的模板“sidebar-filters.php”。这是我里面的代码。
<div id="secondary" class="widget-area" role="complementary">
I'm the sidebar filters
<?php
$current_countries = get_query_var('countries');
$current_stays = get_query_var('stays');
$countries = get_categories('child_of=62');
$stays = get_categories('child_of=63');
?>
<form action="<?php the_permalink(); ?>" id="filterForm" method="post">
<ul>
<li>
<label><b>Countries</b></label>
</li><br/>
<?php
foreach ($countries as $country) {
// var_dump($country->cat_ID);
// var_dump($country->name);
echo sprintf('<li><input type="checkbox" name="countries[]" id="checkbox_%s" value="%s" %s',$country->name , $country->cat_ID, set_checked($current_countries, $country));
echo sprintf('/><label for="checkbox_%s">%s</label></li>',$country->name,$country->name );
}
?>
</ul><br/><br/>
<ul>
<li>
<label><b>Length of stay</b></label>
</li><br/>
<?php
foreach ($stays as $stay) {
// var_dump($stay->cat_ID);
// var_dump($stay->slug);
echo sprintf('<li><input type="checkbox" name="stays[]" id="checkbox_%s" value="%s" %s',$stay->slug , $stay->cat_ID, set_checked($current_stays, $stay));
echo sprintf('/><label for="checkbox_%s">%s</label></li>',$stay->slug,$stay->name );
}
?>
</ul><br/><br/>
<ul>
<li>
<button type="submit">Send email</button>
</li>
</ul>
<input type="hidden" name="submitted" id="submitted" value="true" />
</form>
这是我在function.php
function my_query_vars($ vars) { array_push($ vars,'countries','stay'); 返回$ vars; } add_filter('query_vars','my_query_vars');
function set_checked($ arr,$ value) { $ checked =''; if(!empty($ arr)&amp;&amp; in_array($ value,$ arr))$ checked ='checked'; return $ checked; }
function my_query($query)
{
// You can use is_archive() or whatever you need here
if ($query->is_main_query() && is_search()) {
$cat_and = array();
foreach (array('countries', 'stays') as $variable) {
$categories = get_query_var($variable);
if (!empty($categories)) {
$cat_and = array_merge($cat_and, $categories);
}
}
if (!empty($cat_and)) $query->set('category__and', $cat_and);
}
}
add_action('pre_get_posts', 'my_query');
But, I'm retrieving nothing for the moment, what do I am doing wrong?
答案 0 :(得分:3)
这是使用表单执行此操作的基本思路:
首先,您必须注册新的查询变量,以便您可以使用GET并在网址中包含过滤器(以后可以根据需要重写):
add_filter('query_vars', 'my_query_vars');
function my_query_vars($vars)
{
array_push($vars, 'countries', 'stays');
return $vars;
}
然后创建一个表单并使用每个复选框组的数组名称打印类别。您需要确保恢复提交表单后检查的复选框,您可以在同一页面上执行此操作。
function set_checked($arr, $value)
{
$checked = '';
if (!empty($arr) && in_array($value, $arr)) $checked = 'checked';
return $checked;
}
$current_countries = get_query_var('countries');
$current_stays = get_query_var('stays');
$countries = get_categories('child_of=id_for_countries');
$stays = get_categories('child_of=id_for_length-of-stay');
// Begin form
foreach ($countries as $country) {
echo sprintf('<input type="checkbox" name="countries[]" value="%s" %s', $country->cat_ID, set_checked($current_countries, $country));
}
foreach ($stays as $stay) {
echo sprintf('<input type="checkbox" name="stays[]" value="%s" %s/>', $stay->cat_ID, set_checked($current_stays, $stay));
}
// End form
最后,您需要根据以下变量修改查询以进行过滤:
add_action('pre_get_posts', 'my_query');
function my_query($query)
{
// You can use is_archive() or whatever you need here
if ($query->is_main_query() && is_search()) {
$cat_and = array();
foreach (array('countries', 'stays') as $variable) {
$categories = get_query_var($variable);
if (!empty($categories)) {
$cat_and = array_merge($cat_and, $categories);
}
}
if (!empty($cat_and)) $query->set('category__and', $cat_and);
}
}
我没有测试过,但这应该有效,希望这有帮助。
答案 1 :(得分:1)
<?php
$checkboxArray = $_POST['checkbox']; //checkbox[] is name of all your checkboxes
$catIds = implode(',',$checkboxArray);
$my_query = new WP_Query('showposts=10&cat='.$catIds); ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
<?php the_title(); ?></a>
<?php the_content(); ?> //optional, can also be the_excerpt
<?php endwhile; ?>
You can change the value of showposts as you required.