WordPress 发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存

本站使用WordPress 博客系统,腾讯云CDN+云解析 ,为追求速度,全站静态缓存。

但在发布和更新文章、提交及审核评论后,CDN缓存导致首页不能及时显示更新,在张戈博客发现了这段“自动清理腾讯云CDN缓存”的代码,马上用上——网络高手们确实多啊。

完整的 php 代码如下:

/**
* WordPress 发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存(首页和当前文章) By 张戈博客
* 文章地址:https://zhangge.net/5089.html
* 转载请保留出处,谢谢合作!
**/

/* 需要填写你的密钥,访问 https://console.qcloud.com/capi 获取 SecretId 及 $secretKey */
$secretKey = '此处填写SECRET_KEY';
$secretId  = '此处填写SECRET_ID';

//更新或发布文章清理本文和首页CDN缓存
add_action('publish_post', 'Clean_By_Publish', 0);

//提交评论更新本文CDN缓存
add_action('comment_post', 'Clean_By_Comments',0);

//评论被审核更新本文CDN缓存
add_action('comment_unapproved_to_approved', 'Clean_By_Approved',0);

//发布文章更新CDN缓存函数
function Clean_By_Publish($post_ID){
    global $secretKey,$secretId;
    $url = get_permalink($post_ID);
    $action='RefreshCdnUrl';
    /*要清理的页面,默认包含首页和文章页面,需要清理其他页面请自行发挥*/
    $PRIVATE_PARAMS = array(
                    'urls.0' => home_url(),
                    'urls.1' => $url ,
                    );
    $HttpUrl="cdn.api.qcloud.com";
    /*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/
    $HttpMethod="POST";
    /*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/
    $isHttps =true;
    /*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/
    $COMMON_PARAMS = array(
                    'Nonce' => rand(),
                    'Timestamp' =>time(NULL),
                    'Action' =>$action,
                    'SecretId' => $secretId,
                    );
    /***********************************************************************************/
    CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps);
}

//提交评论清理文章CDN函数
function Clean_By_Comments($comment_id) 
{
    global $secretKey,$secretId;
    $comment = get_comment($comment_id);
    $url = get_permalink($comment->comment_post_ID);
    $action='RefreshCdnUrl';
    /*参数*/
    $PRIVATE_PARAMS = array(
                    'urls.0' => $url,
                    );
    $HttpUrl="cdn.api.qcloud.com";
    /*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/
    $HttpMethod="POST";
    /*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/
    $isHttps =true;
    /*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/
    $COMMON_PARAMS = array(
                    'Nonce' => rand(),
                    'Timestamp' =>time(NULL),
                    'Action' =>$action,
                    'SecretId' => $secretId,
                    );
    /***********************************************************************************/
    CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps);
}

//评论被审核清理CDN缓存函数
function Clean_By_Approved($comment)
{
    global $secretKey,$secretId;
    $url = get_permalink($comment->comment_post_ID);
    $action='RefreshCdnUrl';
    /*参数*/
    $PRIVATE_PARAMS = array(
                    'urls.0' => $url,
                    );
    $HttpUrl="cdn.api.qcloud.com";
    /*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/
    $HttpMethod="POST";
    /*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/
    $isHttps =true;
    /*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/
    $COMMON_PARAMS = array(
                    'Nonce' => rand(),
                    'Timestamp' =>time(NULL),
                    'Action' =>$action,
                    'SecretId' => $secretId,
                    );
    /***********************************************************************************/
    CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps);
}

//请求主函数,无需改动
function CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps)
{
        $FullHttpUrl = $HttpUrl."/v2/index.php";
        /***************对请求参数 按参数名 做字典序升序排列,注意此排序区分大小写*************/
        $ReqParaArray = array_merge($COMMON_PARAMS, $PRIVATE_PARAMS);
        ksort($ReqParaArray);
        /**********************************生成签名原文**********************************
         * 将 请求方法, URI地址,及排序好的请求参数  按照下面格式  拼接在一起, 生成签名原文,此请求中的原文为 
         * GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz
         * &SecretId=AKIDz8krbsJ5yKBZQ    ·1pn74WFkmLPx3gnPhESA&Timestamp=1408704141
         * &instanceIds.0=qcvm12345&instanceIds.1=qcvm56789
         * ****************************************************************************/
        $SigTxt = $HttpMethod.$FullHttpUrl."?";
        $isFirst = true;
        foreach ($ReqParaArray as $key => $value)
        {
                if (!$isFirst) 
                {
                        $SigTxt = $SigTxt."&";
                }
                $isFirst= false;
                /*拼接签名原文时,如果参数名称中携带_,需要替换成.*/
                if(strpos($key, '_'))
                {
                        $key = str_replace('_', '.', $key);
                }
                $SigTxt=$SigTxt.$key."=".$value;
        }
        /*********************根据签名原文字符串 $SigTxt,生成签名 Signature******************/
        $Signature = base64_encode(hash_hmac('sha1', $SigTxt, $secretKey, true));
        /***************拼接请求串,对于请求参数及签名,需要进行urlencode编码********************/
        $Req = "Signature=".urlencode($Signature);
        foreach ($ReqParaArray as $key => $value)
        {
                $Req=$Req."&".$key."=".urlencode($value);
        }
        /*********************************发送请求********************************/
        if($HttpMethod === 'GET')
        {
                if($isHttps === true)
                {
                        $Req="https://".$FullHttpUrl."?".$Req;
                }
                else
                {
                        $Req="http://".$FullHttpUrl."?".$Req;
                }
                $Rsp = file_get_contents($Req);
        }
        else
        {
                if($isHttps === true)
                {
                        $Rsp= SendPost("https://".$FullHttpUrl,$Req,$isHttps);
                }
                else
                {
                        $Rsp= SendPost("http://".$FullHttpUrl,$Req,$isHttps);
                }
        }
        //var_export(json_decode($Rsp,true));
        return json_decode($Rsp,true);
}
function SendPost($FullHttpUrl, $Req, $isHttps)
{
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $Req);
        curl_setopt($ch, CURLOPT_URL, $FullHttpUrl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 1 );
        if ($isHttps === true) {
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,  false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  false);
        }
        $result = curl_exec($ch);
        return $result;

先访问 腾讯云的 API 密钥 创建或获取你在腾讯云的 API 密钥:

然后正确替换上述代码中的8,9行的 secretKey 和 secretId 值,比如:

/* 需要填写你的密钥,访问 https://console.qcloud.com/capi 获取 SecretId 及 $secretKey */
$secretKey = 'ABCD123CSDFSBSDFDSF';
$secretId  = 'CDAABBBSDFA683N23423N4';

部署后,博客发布或更新文章、评论的提交或审核都会调用 API 去清理 CDN 缓存,其中文章和评论的提交可能会比没有部署略微卡一点,评论的审核是异步提交,所以感知不到什么。

WordPress 500错误的原因和解决方法

WordPress前台不显示,一般的错误都是没有主题,可以直接从后台切换下主题,然后再换回去就可以了。如果后台都不显示了,并500报错解决办法,则错误可能有两点(咱就是第二个错误,花了几天时间才解决):

1、伪静态错误。如果可以直接操作数据库的话,就把数据库里面的伪静态规则的内容给删除了。具体数据库表位wp_options(wp_为数据表前缀,不一样的请自行替换,修改地点为下图红框内的),删除option_value的值(我的是自定义规则,默认的是http://域名/?p=123),删除值后便可以恢复到初始的伪静态(固定链接)http://域名/?p=123了。现在就可以尝试打开后台了。如果还不可以打开的话,请再做第二步。【可以显示的话,那么就恭喜你了,现在可以重新改会原来的伪静态而不会不显示了】

2、插件不兼容。同样,操作数据库,就把数据库里面的已启用插件全部取消了。具体数据库表位wp_options(wp_为数据表前缀,不一样的请自行替换,具体修改内容为下图红框内的),删除option_value的值。现在就可以尝试打开后台了。然后尝试启用插件,看看到底是哪个插件不兼容,然后禁用或者升级插件。

我喜欢的wordpress模板

今天工信部无缘无故删了我的域名备案号,怕是ewsidc或工信部要清理一些问题网站了,本着预防的出发点,把自己一直喜欢的几款wordpress模板名称保留下来。毕竟两年的淘汰,喜气洋洋留下来的模板应该算是精品吧,喜欢的童鞋自己去下。

BlogoLife 2.0,作者为 wplook

Buttercream 1.0.5,作者为 Caroline Moore

Coaster 1.6,作者为 Themes WP Free

dfBlog 1.2.05,作者为 danielfajardo web

Esquire 1.0,作者为 Matthew Buchanan

Esther 2.0,作者为 Patrick Chia

gplus 1.4,作者为 welefen

Greener Side 1.08,作者为 Adazing Web Design

Memoir 1.0,作者为 Elegant Themes

monochrome 3.0.4,作者为 mono-lab

Patchwork 1.0,作者为 Caroline Moore

River of Silver 1.0.4,作者为 zwwooooo & schiy

Scrappy 1.3,作者为 Caroline Moore

Simple-M 1.0.0,作者为 Microhu

Twenty Eleven 1.3,作者为 the WordPress team

wordpress首行缩进

其实要想实现WordPress首行缩进的效果很简单.只要在你当前使用的主题style.CSS中增加一段代码即可.以下是修改后的CSS关于WordPress首行缩进的代码

p {
margin: 0.7em 0;
text-indent:2em;
line-height:1.8em;
}

其实起作用的就是text-indent:2em;这一句.原理就是WordPress换行的时候缩进一下.

赶紧动手试试吧,马上你的WordPress博客也可以首行缩进了.

去掉WP功能模块中WordPress.org的链接

教大家去掉WordPress右边功能模块中WordPress.org的链接方法:
找到wp-includes目录下的default-widgets.php文件打开,在大概300行左右找到(我一般用dw查找功能):

<li><a href=” wordpress.org/” title=”<?php echo esc_attr(__(‘Powered by WordPress, state-of-the-art semantic personal publishing platform.’)); ?>”>WordPress.org</a></li>

将它删去就可以了,不该提醒大家,每次WordPress升级后,会自动覆盖,所有必须重新改过。

PS:其实很多朋友都不喜欢那个“功能”小模块出现在首页,所以一些WordPress主题的“管理”选项单独出现在页尾。其实这也很简单,你看看刚才那行代码的上面几排内容就明白了——复制下来粘贴到主题footer里,ok?

这两处改动我将在本博展示一段时间,欢迎点击试用