2

嗨 Stack Overflow 社区。

我正在为撒旦开发一个 wordpress 网站。首先,我是一名初级 Web 开发人员,所以假设我还有很多东西要学... :-) 这是我第一次使用 Ajax,我对 PHP 没有太多经验或 wordpress 之外的 SQL。

该网站具有基于复选框的搜索功能。我有 2 组 3 个复选框(所以,总共 6 个)。所以,我有 2 个分类法,每个复选框代表一个不同的术语。我想根据撒旦使用这些复选框选择的类别,使用 ajax 更改页面的内容。我能够做到这一点,但一次只能使用一个复选框组合。因为有几十种不同的组合,我不认为编写几十种不同的查询/参数(每个组合一个)是一个好策略。那么,我该怎么做呢?

让我们看一个例子,让你明白我的意思:

想象一下,撒旦想通过一个表格来检查地狱里的灵魂数量。有两组复选框,一组用于人,一组用于惩罚,如下所示:

人们

  • 男士
  • 女性
  • 孩子们

惩罚

  • 在火焰中
  • 刺穿
  • 被恶魔吃掉

现在,我有这个 jQuery Ajax 代码:

$('#searchsouls').click(function(){
    $.ajax({
        url:"<?php echo get_bloginfo('template_url'); ?>/evil-laugh.php",
        type:"POST",
        async:"false",
        data:$("#de-form").serialize(),
        success:function(data) {
            $('#666').empty().html(data);
        },
        error:function(e){
            console.log('Error: ' + e);
        }
  });
  return false;
})

这工作得很好。然后,我在 evil-laugh.php 中有这段代码:

<?php global $query_string;
$args = wp_parse_args($query_string);
$args = array(
'post_type' => 'souls',
'paged' => $paged, 
'orderby' => 'title',
'order' => 'ASC',
'posts_per_page' => -1,
'post_status' => 'publish',
);

?>

<!--  THE LOOP -->
<?php $wp_query = new WP_Query( $args ); ?>
<?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?>

当然,这显示了所有的灵魂和各种惩罚,没有什么花哨的。我知道我可以通过为每个类别组合定义一组不同的论点来实现撒旦想要的。类似于(假设“Impaled”术语的 ID 为 9,并且“cat9”是复选框的名称):

if ($_POST['cat9']) {
$args = array(
'post_type' => 'souls',
'paged' => $paged, 
'orderby' => 'title',
'order' => 'ASC',
'posts_per_page' => -1,
'post_status' => 'publish',
'punishment' => 'impaled',
);

但是,有几十种不同的组合。这里有几个例子:

  • 男子被刺穿
  • 被恶魔吃掉的妇女或儿童
  • 男人或女人在火焰中或被刺穿
  • 儿童在火焰中或被刺穿或被恶魔吃掉

我想我可以做某种“for循环”来完成这个,但我不知道如何做到这一点或如何将类别ID添加到wordpress查询中,定义相应的AND和OR。

我真的很感谢在这个问题上的一些帮助。但是,请记住,我不想要一个解决方案,我想了解我在做什么并尽可能学习一些新东西。

提前致谢。

4

1 回答 1

6

好吧,我自己设法找到了解决方案。不确定它是否是解决此类问题的最强大的解决方案,但如果有人正在寻找同样的东西,那就去吧。出于实际原因,我将每个复选框的名称更改为关联类别的名称。因此,例如,对于我使用的“男性”复选框name="Men",其他类别也是如此。这是代码:

if ($_POST['men']) {
    $args['people']='men';
}   

if ($_POST['women']) {
    if ($_POST['men']) {
        if ($_POST['children']) {
            $args['people']='men, women, children';
        } else {
            $args['people']='men, women';
        }   
    } else {
        $args['people']='women';
    }   
}

if ($_POST['children']) {
    if ($_POST['women']) {
        if ($_POST['men']) {
            $args['people']='men, women, children';
        } else {
            $args['people']='women, children';
        }   
    } elseif ($_POST['men']) {
        $args['people']='men, children';
    } else {
        $args['people']='children';
    }   
}

我对惩罚类别有相同的代码,当然有不同的条款。我相信我的代码仍然存在某种冗余,但效果很好。我将不得不稍后检查。当然,这仅适用于 3 个类别,如果您有很多类别,您将不会有很多有趣的编程,所以最好考虑如何使用“for 循环”或类似的。干杯!

更新:新的更好的解决方案

最后我设法回到这个项目。我不仅设法了解了更多关于 PHP 的知识,而且代码现在更加健壮,我可以添加任意数量的类别术语。开始:

$people_args = array(
    'type' => 'souls',
    'taxonomy' => 'people',
    'orderby' => 'name',
    'order' => 'ASC',
);
$people = get_categories($people_args);
$arr_people = array();
foreach ($_POST as $key => $value) {
   foreach($people as $person){
        if($person->slug == $key){
            array_push($arr_people, $key);
        }
   }            
}
$values_people = implode(",", $arr_people);
$args['people']=$values_people;

$punishment_args = array(
    'type' => 'souls',
    'taxonomy' => 'punishment',
    'orderby' => 'name',
    'order' => 'ASC',
);
$punishments = get_categories($punishment_args);
$arr_punishment = array();
foreach ($_POST as $key => $value) {
   foreach($punishments as $punishment){
        if($punishment->slug == $key){
            array_push($arr_punishment, $key);
        }
   }            
}
$values_punishment = implode(",", $arr_punishment);
$args['punishment']=$values_punishment;

不确定是否有人对此感兴趣,但这是我目前的解决方案。这是一种使用复选框按类别显示内容的全功能 AJAX 方式。网站完成后,我会将 URL 放在这里,以便您可以根据需要测试此代码。知识就是力量。

于 2012-04-09T09:31:12.950 回答