【问题标题】:How can I retain the archive.php loop filters when triggering with AJAX?使用 AJAX 触发时,如何保留 archive.php 循环过滤器?
【发布时间】:2014-02-10 22:39:15
【问题描述】:

我一直在研究这个Getting Loopy 教程,将帖子附加到我的Packery.js 布局,它在我的主页上运行良好,但每当我尝试将它用于我的存档 (archive.php) 页面时,它会继续加载所有帖子,而不是特定于该类别的帖子(或搜索查询等)。如何在使用 AJAX 触发时保留过滤 WordPress 的 archive.php 循环似乎固有的?

目前,我在archive.php 页面上有一个标准<?php while (have_posts()) : the_post();?> 作为主循环,它正确调用了前十二个类别的帖子。然后我一直在尝试使用第二个循环来附加额外的帖子。正如我之前所说,这会调用所有帖子(不仅仅是类别)。我目前的尝试是在第二个循环中识别类别,但我似乎弄错了。相关的当前代码如下(未更改的代码在上面的教程链接上)。有任何想法吗?谢谢!

页脚中的 AJAX 触发脚本:

var pager = 1;
var archive_load_posts = function(){  
    $.ajax({  
        type       : "GET",  
        data       : {pageNumber: pager},  
        dataType   : "html",  
        url        : "http://tay.is/designing/belmontvision/wp-content/themes/yamidoo/archive-more-loop.php",  
        beforeSend : function(){},  
        success    : function(data){  
            var $data = $(data);  
            $container.append( $data ) .packery( 'appended', $data );
            heightcalc();
            $container.packery();
        }
    });
};

$('.archive-load-more').click( function() {
    archive_load_posts();
    pager++;
});

archive-more-loop.php 的基础:

<?php   require_once('../../../wp-load.php');   
        $page = (isset($_GET['pageNumber'])) ? $_GET['pageNumber'] : 0;
        $category = get_queried_object_id();

        query_posts(array(  
            'paged' => $page,
            'cat' => $category
        ));  

        while (have_posts()) : the_post(); ?>
<?php endwhile; ?>

【问题讨论】:

    标签: php jquery ajax wordpress packery


    【解决方案1】:

    AJAX 请求代表对服务器的 请求。它不会在原始页面的“内部”执行。 get_queried_object() 之类的东西不起作用,或者最多会返回与原始页面不同的东西。

    您必须将任何信息显式传递给 AJAX 处理程序脚本——因为您使用的是GET,您需要将查询变量附加到这一行,"http://tay.is/designing/belmontvision/wp-content/themes/yamidoo/archive-more-loop.php",使其看起来更像这样"http://tay.is/designing/belmontvision/wp-content/themes/yamidoo/archive-more-loop.php?category=123"这意味着您的archive_load_posts 脚本需要找到类别或任何其他信息,并将其传递。

    如果您将其直接打印到页脚,并且看起来可能是这样,那么您可以执行以下操作可能工作:

    $category = get_queried_object_id(); ?>
    <script type="text/javascript">
    
        var archive_load_posts = function(){  
            $.ajax({  
                type       : "GET",  
                data       : {pageNumber: pager},  
                dataType   : "html",  
                url        : "http://tay.is/designing/belmontvision/wp-content/themes/yamidoo/archive-more-loop.php?category=<?php echo $category ?>",  
                beforeSend : function(){},  
                success    : function(data){  
                    var $data = $(data);  
                    $container.append( $data ) .packery( 'appended', $data );
                    heightcalc();
                    $container.packery();
                }
            });
    
    };
    </script><?php
    

    问题:

    1. WordPress 在"noConflict" 模式下加载jQuery。 $ 别名 尽管未发布的代码可能会纠正该问题,但无法正常工作。
    2. 您完全忽略了WordPress AJAX API 强制 可能不可靠的黑客攻击,例如 require_once('../../../wp-load.php');。正确执行此操作的方法 将是 registerenqueue 您的脚本并使用 wp_localize_script 将变量写入页面。要了解它的外观,请参阅 wordpress.stackexchange.com 上的 this answer(mine)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2021-07-02
      • 1970-01-01
      • 2015-10-27
      相关资源
      最近更新 更多