【问题标题】:Wordpress: loop for changing query with ajax?Wordpress:使用ajax更改查询的循环?
【发布时间】:2012-04-05 10:38:54
【问题描述】:

Hi Stack Overflow 社区。​​p>

我正在为撒旦开发一个 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。

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

提前致谢。

【问题讨论】:

    标签: php jquery ajax wordpress


    【解决方案1】:

    好吧,我自己设法找到了解决方案。不确定它是否是解决此类问题的最可靠的解决方案,但如果有人正在寻找相同的东西,这里可以使用。 出于实际原因,我将每个复选框的名称更改为关联类别的名称。因此,例如,对于“男性”复选框,我使用了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 放在这里,以便您可以根据需要测试此代码。 知识就是力量。

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2022-08-17
      相关资源
      最近更新 更多