在处理我的最新项目DevGrow Discussions时 ,我遇到了将整个WordPress侧栏嵌入非WordPress网站 (特别是bbPress论坛)的需求 。 由于我利用各种小部件来显示受欢迎的帖子和其他动态内容,因此仅复制和粘贴HTML是不够的。 最后,实际上只有两种方法可以解决此问题:
- 在应用程序中包含wp-load.php文件,并实际上加载整个WordPress以获得对插件功能的访问
- 使用简单的缓存以HTML格式存储侧边栏并将其包含在任何其他应用程序中,然后在发布新内容时根据需要重新构建它
如果不够明显,则第一种选择就数据库查询而言是非常昂贵的,并且会大大降低您的网站速度。 第二种选择在实现上需要付出一些努力,但是在性能方面没有竞争。
缓存WordPress边栏
在编写函数之前,我们需要确切地了解我们要执行的操作。 我们的目标是将侧边栏缓存到文本文件,并在发布帖子 ,更改主题或更改侧边栏小部件时更新该缓存 。 由于我们计划使用缓存在其他应用程序上显示侧边栏,因此我们需要能够轻松删除缓存而不会产生任何不良影响(我们不希望侧边栏随时断开)。
为了有效地完成此任务,我们还将创建一个缓存文件的日志,并使用该 日志 来确定是否应清除缓存 。 如果是这样,下次有人访问WordPress网站时,实际的缓存文件将被覆盖,以确保始终在两个应用程序上都显示正确的侧边栏。
创建功能
首先,打开主题的functions.php文件,并向其中添加以下功能:
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末尾添加以下内容:
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并将此行添加到文件的开头:
<?php cache('start', 'sidebar'); ?>
此功能将开始缓存所需的侧边栏,否则将不执行任何操作。 由于PHP输出缓冲功能的工作方式,我们还需要在文件末尾关闭缓冲区。 将此行添加到同一文件的最底部:
<?php cache('end', 'sidebar'); ?>
添加这两行后,刷新您的博客。 您将不会在浏览器中看到任何内容,而是查看主题文件夹中的/ cache目录,并且应该看到两个以cache-开头的文件。
使用缓存
现在,您已经创建了缓存文件,您可以在有权访问该文件的任何应用程序中使用它。 您可以使用include_once函数轻松地做到这一点,但是为了安全起见,我还喜欢确保文件存在:
<?php
$myCachedFile = "/path/to/cache-sidebar.txt";
if(file_exists($myCachedFile))
include_once($myCachedFile);
else
echo "Cache doesn't exist.";
?>
只要确保仔细检查您的文件路径是正确的即可。 如果要将缓存设置为从外部应用程序中删除,则必须在脚本中的某个位置包含cache_purge函数,并在必要时直接调用该函数。 之后,只需调用函数即可:
<?php purge_cache(); ?>
结论
该技术对于任何PHP应用程序都非常有用,尤其是当您希望显示动态内容而不必牺牲性能时。 使用它可以加快WordPress的安装速度,也可以在其他任何网站或应用程序上使用有用的功能(如边栏)。
编者注:这篇文章是由Monjurul Dolon为Hongkiat.com撰写的。 Monjurul是纽约市的界面设计师和网络开发人员,一生自由地生活。 他在DevGrow.com上发表博客,在其中分享有关Web开发和设计的技巧和资源。
翻译自: https://www.hongkiat.com/blog/display-wordpress-sidebar-on-other-non-wp-sites/