如何在非 WordPress 网站上显示 WordPress 侧边栏
在处理我的最新项目DevGrow Discussions时,我发现需要将我的整个 WordPress 侧边栏嵌入到非 WordPress 站点——特别是bbPress 论坛。由于我使用各种小部件来显示热门帖子和其他动态内容,因此简单地复制和粘贴 HTML 是不够的。最后,实际上只有两种方法可以解决这个问题:
- 在您的应用程序中包含您的wp-load.php文件,实际上加载整个 WordPress 以访问插件功能
- 使用简单缓存以 HTML 格式存储侧边栏并将其包含在任何其他应用程序中,然后在发布新内容时根据需要重建它
如果不够明显,第一个选项在数据库查询方面的成本非常高,并且会显着降低您的网站速度。第二种选择在实施时需要付出一些努力,但在性能方面没有竞争。
缓存你的 WordPress 侧边栏
在我们可以编写我们的函数之前,我们需要准确地理解我们想要做什么。我们的目标是将侧边栏缓存到一个文本文件中,并在我们发布帖子、更改主题或对侧边栏小部件进行更改时更新该缓存。由于我们计划使用我们的缓存在不同的应用程序上显示侧边栏,我们需要能够轻松删除缓存而不会产生任何不良影响(我们不希望我们的侧边栏随时损坏)。
为了有效地完成此任务,我们还将创建缓存文件的日志,并使用它来确定是否应清除缓存。如果是这样,下次有人访问 WordPress 站点时,实际的缓存文件将被覆盖,确保始终在两个应用程序上呈现正确的侧边栏。
创建函数
首先,打开主题的functions.php文件并向其中添加以下函数:
1个
2个
3个
4个
5个
6个
7
8个
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48岁
49
|
function cache( $task , $cacheFile , $cacheTime = 21600){ global $cache ; // Configure files and directories: $cacheDir = TEMPLATEPATH. "/cache" ; $cacheFileName = $cacheDir . "/cache-$cacheFile.txt" ; $cacheLogFile = $cacheDir . "/cache-log.txt" ; // Make cache directory if it doesn't exist if (! is_dir ( $cacheDir )) mkdir ( $cacheDir , 0755); // Make a log of the cache files with their current status if ( file_exists ( $cacheLogFile )) $cacheLog = unserialize( file_get_contents ( $cacheLogFile )); else $cacheLog = array (); if ( $task == 'start' ){ // If cache exists, is less than 6 hours old and is not in deletion queue, keep it - otherwise rebuild cache if ( file_exists ( $cacheFileName ) && (time() - filemtime ( $cacheFileName )) < $cacheTime && $cacheLog [ $cacheFile ] == 1){ $cache = false; } else { $cache = true; ob_start(); } } elseif ( $task == 'end' && $cache ){ // If caching, save file contents and update log file_put_contents ( $cacheFileName ,ob_get_contents()); ob_end_flush(); $cacheLog [ $cacheFile ] = 1; file_put_contents ( $cacheLogFile ,serialize( $cacheLog )); } elseif ( $task == 'purge' ){ // Set cache to delete and update log $cacheLog [ $cacheFile ] = 0; file_put_contents ( $cacheLogFile ,serialize( $cacheLog )); } } function cache_purge(){ $cacheDir = TEMPLATEPATH. "/cache" ; $cacheLogFile = $cacheDir . "/cache-log.txt" ; if ( file_exists ( $cacheLogFile )) $cacheLog = unserialize( file_get_contents ( $cacheLogFile )); else $cacheLog = array (); foreach ( $cacheLog as $key => $value ) $cacheLog [ $key ] = 0; file_put_contents ( $cacheLogFile ,serialize( $cacheLog )); } |
这些第一个函数cache是让我们的缓存工作的关键。根据您在文件中调用它的位置,该函数将设置正确的文件和目录,验证是否需要构建缓存,如果需要,将保存输出并更新缓存日志。该函数使用 PHP 的输出缓冲将生成的任何 HTML 保存到文本文件中。
第二个函数用于清除所有缓存文件,对于添加到现有的WordPress 挂钩非常有用。有了它,我们可以在每次更新主题、保存帖子或更新侧边栏小部件时清除缓存,方法是在functions.php的末尾添加以下内容:
1个
2个
3个
|
add_action( 'switch_theme' , 'cache_purge' , 10); add_action( 'publish_post' , 'cache_purge' , 10); add_filter( 'widget_update_callback' , 'cache_purge' , 10); |
有关挂钩的完整列表,请查看WordPress 插件 API 参考。
配置你的侧边栏
现在您已准备好函数,可以开始缓存侧边栏了。打开sidebar.php并将此行添加到文件的开头:
1个
|
<?php cache( 'start' , 'sidebar' ); ?> |
这个函数将开始缓存它需要的侧边栏,否则它什么都不做。由于 PHP 输出缓冲功能的工作方式,我们还需要在文件末尾关闭缓冲区。将此行添加到同一文件的最底部:
1个
|
<?php cache( 'end' , 'sidebar' ); ?> |
添加这两行后,刷新您的博客。您不会在浏览器中看到任何内容,但检查主题文件夹中的/cache目录,您应该会看到两个以cache-开头的文件。
使用你的缓存
现在您已经创建了缓存文件,您可以在任何可以访问它的应用程序中使用它。您可以使用include_once函数轻松执行此操作,但为了安全起见,我也喜欢确保文件存在:
1个
2个
3个
4个
5个
6个
7
|
<?php $myCachedFile = "/path/to/cache-sidebar.txt" ; if ( file_exists ( $myCachedFile )) include_once ( $myCachedFile ); else echo "Cache doesn't exist." ; ?> |
请务必仔细检查您的文件路径是否正确。如果要将缓存设置为从外部应用程序中删除,则必须在脚本中的某处包含cache_purge函数,并在必要时简单地调用它。之后,只需调用函数即可:
1个
|
<?php purge_cache(); ?> |
结论
这种技术对任何 PHP 应用程序都非常有用,尤其是当您希望在不牺牲性能的情况下显示动态内容时。用它来加速您的 WordPress 安装或能够在任何其他网站或应用程序上使用有用的位(如侧边栏)。