wordpress侧边栏_如何在非WordPress网站上显示WordPress侧边栏

在处理我的最新项目DevGrow Discussions时 ,我遇到了将整个WordPress侧栏嵌入非WordPress网站 (特别是bbPress论坛)的需求 。 由于我利用各种小部件来显示受欢迎的帖子和其他动态内容,因此仅复制和粘贴HTML是不够的。 最后,实际上只有两种方法可以解决此问题:

  1. 在应用程序中包含wp-load.php文件,并实际上加载整个WordPress以获得对插件功能的访问
  2. 使用简单的缓存以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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值