具有多个分类和多个分类术语的分类搜索/过滤

时间:2015-04-11 作者:taxman

我正在尝试构建一个高级搜索表单,允许用户从两个基于分类法的下拉菜单中进行选择。每个分类下拉列表都有分类术语,用户可以从中选择多个术语。当他们做出选择时,应将其转发到搜索结果页面,该页面可查询和显示匹配的结果。我试着从这篇文章改编:http://fearlessflyer.com/how-to-create-an-advanced-search-form-for-wordpress/.

我有一个名为“recipe”的自定义帖子类型,其中有两个分类法,分别是“膳食类型”和“烹饪”。分类法有以下术语:

膳食类型

晚餐、早餐、菜肴

当您选择晚餐和美式或早餐和法式时,以下代码可以正常工作,但当您在分类下拉列表中选择多个术语时,则无法正常工作。从逻辑上讲,当一个人选择并提交法语和美语时,应该显示包含法语或美语的帖子。但是,它不起作用。其功能应类似于以下高级搜索:http://cooking.nytimes.com/search?

我认为问题在于,我不知道如何通过$\\u POST将多个分类术语提交到搜索页面,以便查询并显示在结果页面上。

谢谢

功能。php

function buildSelect($tax){ 
$terms = get_terms($tax);
$x = \'<select multiple="multiple" name="\'. $tax .\'">\';
$x .= \'<option value="">Select \'. ucfirst($tax) .\'</option>\';
foreach ($terms as $term) {
   $x .= \'<option value="\' . $term->slug . \'">\' . $term->name . \'</option>\';    
}
$x .= \'</select>\';
return $x;
}
主页

<form  method="post" action="<?php bloginfo(\'url\');?>/listing-search-results/"> 
<?php  $taxonomies = get_object_taxonomies(\'recipe\');
    foreach($taxonomies as $tax){
        echo buildSelect($tax);
    }
?>
<input type="submit"/>  
</form>
搜索结果页面

 <?php  
$list = array();
$item = array();  
foreach($_POST as $key => $value){
    if($value != \'\'){
        $item[\'taxonomy\'] = htmlspecialchars($key);
        $item[\'terms\'] = htmlspecialchars($value);
        $item[\'field\'] = \'slug\';
        $list[] = $item;
    }       
}  
$cleanArray = array_merge(array(\'relation\' => \'AND\'), $list);

$args[\'post_type\'] = \'recipe\';
$args[\'showposts\'] = 9;
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$args[\'paged\'] = $paged;  
$args[\'tax_query\'] = $cleanArray; 
$the_query = new WP_Query( $args );

?>

<?php echo ($the_query->found_posts > 0) ? \'<h3 class="foundPosts">\' . $the_query->found_posts. \' listings found</h3>\' : \'<h3 class="foundPosts">We found no results</h3>\';?>
    <?php while ( $the_query->have_posts() ) : $the_query->the_post();?>

    //add our code here i.e. the_title();

    <?php endwhile; wp_reset_postdata();?>       

<div class="row page-navigation"> 
     <?php next_posts_link(\'&laquo; Older Entries\', $the_query->max_num_pages) ?> 
     <?php previous_posts_link(\'Newer Entries &raquo;\') ?> 
</div>

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

主要问题是$_POST$value 是一个数组,但您可以应用htmlspecialchars 它会吐出来,什么也不会回来。

如果尚未这样做,请设置WP_DEBUGtrue 在您的wp-config.php - 没有it的发展根本不是一种选择。

不管怎样,让我们把它弄脏$_POST 回路:

$tax_query = array(); // Don\'t need relation "AND", it\'s the default

foreach ( get_object_taxonomies( \'recipe\' ) as $tax ) {
    if ( isset( $_POST[ $tax ] ) ) {
        $tax_query[] = array(
            \'taxonomy\' => $tax,
            \'terms\' => wp_unslash( ( array ) $_POST[ $tax ] ),
            \'field\' => \'slug\',          
        );
    }
}

$args[\'tax_query\'] = $tax_query; 

结束

相关推荐

Get_Terms();登录时显示私人帖子

嗨,有一个自定义的帖子类型“FAQ”。我有一些私人的“常见问题解答”,也只有登录用户才能看到。我为一个小部件使用了“get\\u terms()”功能,该小部件列出了指向这些“常见问题解答”类别的链接。“get\\u术语”没有列出只有私人“FAQ”的术语。$taxonomy = \'faq_kategorien\'; $tax_terms = get_terms($taxonomy); foreach ($tax_terms as $tax_term) { echo \'

具有多个分类和多个分类术语的分类搜索/过滤 - 小码农CODE - 行之有效找到问题解决它

具有多个分类和多个分类术语的分类搜索/过滤

时间:2015-04-11 作者:taxman

我正在尝试构建一个高级搜索表单,允许用户从两个基于分类法的下拉菜单中进行选择。每个分类下拉列表都有分类术语,用户可以从中选择多个术语。当他们做出选择时,应将其转发到搜索结果页面,该页面可查询和显示匹配的结果。我试着从这篇文章改编:http://fearlessflyer.com/how-to-create-an-advanced-search-form-for-wordpress/.

我有一个名为“recipe”的自定义帖子类型,其中有两个分类法,分别是“膳食类型”和“烹饪”。分类法有以下术语:

膳食类型

晚餐、早餐、菜肴

当您选择晚餐和美式或早餐和法式时,以下代码可以正常工作,但当您在分类下拉列表中选择多个术语时,则无法正常工作。从逻辑上讲,当一个人选择并提交法语和美语时,应该显示包含法语或美语的帖子。但是,它不起作用。其功能应类似于以下高级搜索:http://cooking.nytimes.com/search?

我认为问题在于,我不知道如何通过$\\u POST将多个分类术语提交到搜索页面,以便查询并显示在结果页面上。

谢谢

功能。php

function buildSelect($tax){ 
$terms = get_terms($tax);
$x = \'<select multiple="multiple" name="\'. $tax .\'">\';
$x .= \'<option value="">Select \'. ucfirst($tax) .\'</option>\';
foreach ($terms as $term) {
   $x .= \'<option value="\' . $term->slug . \'">\' . $term->name . \'</option>\';    
}
$x .= \'</select>\';
return $x;
}
主页

<form  method="post" action="<?php bloginfo(\'url\');?>/listing-search-results/"> 
<?php  $taxonomies = get_object_taxonomies(\'recipe\');
    foreach($taxonomies as $tax){
        echo buildSelect($tax);
    }
?>
<input type="submit"/>  
</form>
搜索结果页面

 <?php  
$list = array();
$item = array();  
foreach($_POST as $key => $value){
    if($value != \'\'){
        $item[\'taxonomy\'] = htmlspecialchars($key);
        $item[\'terms\'] = htmlspecialchars($value);
        $item[\'field\'] = \'slug\';
        $list[] = $item;
    }       
}  
$cleanArray = array_merge(array(\'relation\' => \'AND\'), $list);

$args[\'post_type\'] = \'recipe\';
$args[\'showposts\'] = 9;
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$args[\'paged\'] = $paged;  
$args[\'tax_query\'] = $cleanArray; 
$the_query = new WP_Query( $args );

?>

<?php echo ($the_query->found_posts > 0) ? \'<h3 class="foundPosts">\' . $the_query->found_posts. \' listings found</h3>\' : \'<h3 class="foundPosts">We found no results</h3>\';?>
    <?php while ( $the_query->have_posts() ) : $the_query->the_post();?>

    //add our code here i.e. the_title();

    <?php endwhile; wp_reset_postdata();?>       

<div class="row page-navigation"> 
     <?php next_posts_link(\'&laquo; Older Entries\', $the_query->max_num_pages) ?> 
     <?php previous_posts_link(\'Newer Entries &raquo;\') ?> 
</div>

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

主要问题是$_POST$value 是一个数组,但您可以应用htmlspecialchars 它会吐出来,什么也不会回来。

如果尚未这样做,请设置WP_DEBUGtrue 在您的wp-config.php - 没有it的发展根本不是一种选择。

不管怎样,让我们把它弄脏$_POST 回路:

$tax_query = array(); // Don\'t need relation "AND", it\'s the default

foreach ( get_object_taxonomies( \'recipe\' ) as $tax ) {
    if ( isset( $_POST[ $tax ] ) ) {
        $tax_query[] = array(
            \'taxonomy\' => $tax,
            \'terms\' => wp_unslash( ( array ) $_POST[ $tax ] ),
            \'field\' => \'slug\',          
        );
    }
}

$args[\'tax_query\'] = $tax_query; 

相关推荐

在第三方API响应后发送Gravit Forms通知

我有一个重力表单,在提交时将数据发送给第三方API。它与以下代码连接并通过API保存数据。然而,我现在正试图弄清楚,只有当API响应返回为失败或状态代码201以外的任何内容时,才如何发送管理员通知电子邮件。add_action( \'gform_after_submission_1\', \'post_to_third_party\', 10, 2 ); function post_to_third_party( $entry, $form ) { $post_url =