Async Loading of Custom Posts

时间:2020-11-21 作者:asanas

我有一个wordpress页面模板,在那里我加载自定义帖子。

获取这些自定义帖子的代码如下所示:

template-parts/content-page.php

<article id="songs">
    <?php get_template_part( \'partials/content/custom\', \'songs\' ); ?>
</article>

partials/content/custom/songs.php

$args = array(
    \'posts_per_page\'   => 0,
    \'offset\'           => 0,
    \'category\'         => \'\',
    \'category_name\'    => \'\',
    \'orderby\'          => $orderBy,
    \'order\'            => $order,
    \'include\'          => \'\',
    \'meta_key\'         => \'\',
    \'meta_value\'       => \'\',
    \'post_type\'        => \'custom_song\',
    \'post_mime_type\'   => \'\',
    \'post_parent\'      => \'\',
    \'author\'           => \'\',
    \'post_status\'      => \'publish\',
    \'suppress_filters\' => true
);
$songs_array = get_posts( $args );

if (count($songs_array) > 0){
    ?>
    <ul>
    <?php
    foreach ($songs_array as $mysong){
        set_query_var( \'mysong\', $mysong);
        get_template_part( \'partials/content/custom\', \'normal\' );
    }
    ?>
    </ul>
    <?php
}
?>
问题是有2000多条记录。我希望所有这些文件都能在不分页的情况下立即加载。上面的代码可以工作,它确实加载了所有的帖子,但由于这个查询,页面速度很慢。

你能帮助我如何优化这一点并加快加载速度吗?有没有办法异步加载?这样我就可以在页面的这一部分显示加载图标,直到帖子加载完毕?

4 个回复
SO网友:cjbj

测试是唯一可以确定的方法,但我的猜测是,并不是查询本身减缓了页面负载。在获取了那2000条记录之后,您将在其中循环。每次你打电话get_template_part. 此函数依次调用locate_template, 这导致load_template, 在那里您可以找到require 实际加载模板文件的函数。可能正在进行一些缓存,但理论上您正在处理2000个文件加载请求。

因此,我将去掉这个单独的模板文件,并将其集成到循环中。它至少可以为您节省几个函数调用。

SO网友:Bysander

无论您是否通过AJAX加载,如果您需要在一个页面、一次或一个请求中加载2000多条记录,那么您总是要在服务器资源的支配下进行加载。

我将首先研究缓存解决方案,因为这是最简单的快速设置方法,然后在此期间,查询优化将为您节省时间。只有获取您需要显示的基本数据才会有很大帮助。例如,如果仅显示链接,则仅查找标题(&a);Permalink。这可以通过WP_Query 以及fields 参数here - 或自定义MySQL查询。

如果你想走AJAX路线,那么你需要确保你的脚本只输出有用的数据——片段/内容/自定义/歌曲。php模板可以有自己的url端点,然后可以使用jQuery-AJAX load()方法在页面上调用它。不要加载整个页面及其关联的样式表、JS脚本和其他资源(页眉页脚等),然后选择要加载的相关DIV。使该页面成为一个只包含所需数据的纯html页面。

我似乎还记得一件事,叫做;“分块”;Nginx或Apache(不记得是哪个)。我也找不到太多关于它的信息。在脚本末尾完成加载之前,这会从内存将页面的一部分返回给最终用户。如果您希望用户在处理/加载整个页面之前看到“某些东西”,那么这可能值得一看。

最后——教育——告诉客户,如果你的服务器速度慢,而你只有2000张唱片,而他们希望增加歌曲目录,那么你就朝着一个方向前进。昂贵的服务器/CPU账单。向开发人员支付一次修复/优化某个东西的费用通常比每月支付2年以上的更高使用率和更大的服务器账单要便宜。如果你让他们明白这一点,请教我如何。。。

通过查询分页进行AJAX延迟加载是一种明智的方法,您甚至可以在完成第一页加载时触发第一次延迟加载,并将滚动偏移量触发器置于高位-在加载下一位之前,您可能永远看不到列表的结尾。。。。

抱歉-今天文本太多,代码太少。。。但至少要心存感激。这是一条评论,没有人想读那么长的评论

SO网友:Veerji

在您的情况下,您可以使用ajax页面滚动(无限滚动)来加载更多帖子。在第一个页面加载时,它将只加载很少的帖子(例如20篇),当用户滚动到底部并滚动到底部时,ajax将加载更多(20篇)帖子。通过这种方式,您可以使用加载图标异步加载post。

对于无限滚动,如果您想使用,可以使用许多插件。或者你可以使用自己的自定义代码,下面是一些链接,这些链接暗示了MTNS自定义无限滚动,希望对你有所帮助。

  1. https://dev.to/erhankilic/adding-infinite-scroll-without-plugin-to-wordpress-theme-595a
  2. https://scripthere.com/simple-infinite-scroll-for-wordpress-sites-without-plugin/

SO网友:KodimWeb

一个好的做法是使用cron(因为它在后台运行https://github.com/deliciousbrains/wp-background-processing) 生成大量请求(如果请求非常多,可以添加更多队列)。底线是cron生成一个数据数组并将其存储在;“瞬态”;(您可以使用整个布局),然后在适当的时候,您可以通过对数据库的轻度查询来获取此数据。

相关推荐

找到2个ID不唯一的元素(#_ajax_nonce)和(#_wpnonce)

我正在从头开始开发自定义主题,创建自定义帖子类型,并在编辑自定义帖子类型时收到此警告。我还设计了带有两个输入字段的自定义元框,并在其中使用nonce。删除这些警告有什么帮助吗?下面是函数中自定义元框的代码。php//Custom Metabox function register_book_meta_box(){ add_meta_box(\'book_meta_box_id\', \'Book Detail\',\'design_book_meta_box\',\'bo