WordPress实现RSS feed静态化的方法

WordPress实现RSS feed静态化的方法来自露兜博客,收藏备忘!

提示:如果你的feed订阅地址不是http://域名/feed这样的格式,以下内容就不要看了。

WordPress的feed地址一般如: https://www.ludou.org/feed。开启feed功能后可以方便RSS阅读器进行订阅,让读者及时收到博客的更新信息,但是开放feed后有个坏处就是,RSS订阅器会定时或不定时的地访问你的feed订阅地址,以便查看你的feed是否更新,除了RSS阅读器会经常访问你的feed,各路文章采集器和蜘蛛也会经常来光顾你的feed,而且你还不能限制他们的访问频率。

因为WordPress提供的feed是动态生成的,虽然有cache功能,但毕竟要运行php代码,feed被频繁访问势必会消耗一定的服务器资源。那我们今天就来讲讲如何实现feed静态化,直接生成一个index.xml文件,放到WordPress根目录下的feed目录,以后访问 http://网站首页/feed 即可直接读取静态的index.xml,无需WordPress动态生成。

1、禁用默认的feed

众所周知,feed的地址一旦确定下来,如果随便更改,之前已经订阅过的读者可能不会再收到文章更新的通知,势必会流失很多老读者,所以要实现feed的静态化,前提应该是不更改原先的feed订阅地址,但是原先的feed是与WordPress的rewrite规则绑定的,直接在feed目录下放置xml文件,势必会引起冲突。

我的上篇文章已经讲了如何彻底移除并关闭WordPress的feed功能,你以为我是故意教你关闭feed功能,闭关锁国,封闭博客与外界的交流吗?这么想你就错了,上篇文章就是为了今天这篇文章准备的。

所以,第一步就是先按照上篇文章:如何彻底移除并关闭WordPress的Rss Feed,禁用WordPress默认的feed。这一步操作完成后,效果就是打开 http://网站首页/feed,会显示404页面不存在,

当然,如果直接在网站根目录下创建目录,然后放入index.xml也是可以的。

2、生成静态feed

如何生成静态feed呢?这里直接用WordPress自带的wp-includes/feed-rss2.php,我对其做了一些修改:

下载地址1 提取码: 8fdu | 下载地址2

下载后解压,得到myrss.php,可以改名后将其上传到WordPress根目录,跟wp-load.php同在一个目录即可。

3、自动更新静态feed

静态之所以为静态,就是如果你不改它,它的内容永远都是不变的,不像php文件那样会关联更新。我们希望每次发布文章或页面后,自动更新静态feed,达到静态feed的内容和网站内容同步的效果。我们可以将以下PHP代码放到当前主题的functions.php中:

function ludou_update_feed($post_ID) {
  if( wp_is_post_revision( $post_ID ) )
    return;
      
  if ( get_post_status( $post_ID ) == 'publish' && $_POST['original_post_status'] != 'publish' ) {
    if ( !defined('ABSPATH') )
      define('ABSPATH', dirname(__FILE__) . '/');
    
    // 如果你修改过 myrss.php 的文件名称,也要修改下面的 myrss.php
    $file_contents = file_get_contents(get_bloginfo( 'wpurl' ).'/myrss.php');
    file_put_contents(ABSPATH."feed/index.xml", $file_contents, LOCK_EX);
   }
}

add_action('publish_post', 'ludou_update_feed', 16);
add_action('publish_page', 'ludou_update_feed', 16);

注意:PHP代码应该放到 <?php?>之间或 <?php 后面!

到了这一步,操作基本算完成了,在浏览器中打开你的feed地址http://你的网站首页/feed,看看是否可以看到xml代码?不懂的可以看看我的 https://www.ludou.org/feed/

如果xml代码显示正常,那所有操作就完成了。如果打开feed地址依然是404页面未找到或者是文件列表,那么你需要继续看第4步的操作。

4、设置index.xml为默认首页

有些服务器可能只设置了index.phpindex.html为默认首页,这样的话,如果你的feed目录下没有这两个文件的其中之一,只有index.xml,那么直接访问http://你的网站首页/feed就会出现404。解决方法是将index.xml加入到默认首页中。

nginx服务器的设置方法

第1步:打开网站配置文件nginx.conf(也可能在vhost目录下,具体咨询服务器管理员)

第2步:搜索index,找到类似代码:index index.html index.php;,在分号前加上index.xml,类似:
listen 80;
server_name ludou.org www.ludou.org;
index index.html index.php index.xml;
root /wp;

第3步:重启nginx服务即可生效。

Apache服务器

编辑网站根目录下的.htaccess(没有就新建一个),查找:DirectoryIndex,看是否能找到类似代码:
DirectoryIndex index.html index.php

如有,就在后面加上index.xml,如:
DirectoryIndex index.html index.php index.xml

如果找不到DirectoryIndex,那就在.htaccess中加入上面的代码,然后将.htaccess上传到网站根目录下即可。

资料来源:https://www.ludou.org/wordpress-set-rss-update-period.html

彻底移除并关闭WordPress的RSS feed功能

网上流传的关闭WordPress的RSS feed功能多为下面的代码(在主题的functions.php中加入下面的代码)

function disable_all_feeds() {
   wp_die( ‘本站不提供feed’ );
}
add_action(‘do_feed’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_rdf’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_rss’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_rss2’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_atom’, ‘disable_all_feeds’, 1);

这种方法实现的效果是,当你打开博客的feed地址(如https://www.XXX.com/feed)时,页面会直接显示设置的错误信息,feed代码已经被删除,也就是说这个feed地址仍然存在,而不是打开这个链接直接显示404。

下面的代码可以彻底干净的移除并关闭WordPress的RSS feed功能

// 删除 wp_head 输入到模板中的feed地址链接
add_action( ‘wp_head’, ‘wpse33072_wp_head’, 1 );
function wpse33072_wp_head() {
    remove_action( ‘wp_head’, ‘feed_links’, 2 );
    remove_action( ‘wp_head’, ‘feed_links_extra’, 3 );
}

foreach( array( ‘rdf’, ‘rss’, ‘rss2’, ‘atom’ ) as $feed ) {
    add_action( ‘do_feed_’ . $feed, ‘wpse33072_remove_feeds’, 1 );
}
unset( $feed );

// 当执行 do_feed action 时重定向到首页
function wpse33072_remove_feeds() {
    wp_redirect( home_url(), 302 );
    exit();
}

// 删除feed的重定向规则
add_action( ‘init’, ‘wpse33072_kill_feed_endpoint’, 99 );

function wpse33072_kill_feed_endpoint() {
    global $wp_rewrite;
    $wp_rewrite->feeds = array();
    // 运行一次后,记得删除下面的代码
    flush_rewrite_rules();

将以上php代码放入当前主题的functions.php中,然后登陆进入WordPress后台,随便打开一个页面,然后回来在主题的functions.php中将:flush_rewrite_rules(); 这行代码删除即可。

为什么要移除或者关闭WordPress的RSS feed功能?

因为很多时间博客基本没有人订阅,却有一堆机器人来采集博客的feed,方便了别人复制你的文章不说,还造成了不必要的资源消耗。

阻止采集feed的方式很多,比如feed中只输出文章摘要,而不输出全文,这个在WordPress后台 – 设置 – 阅读中就可以设置。但是出于某些目的,并不完全是为了防采集,不想开放博客的feed功能,这就可以采用上面的方法了。

资料来源:https://www.ludou.org/how-to-remove-feeds-from-wordpress-totally.html

给WordPress分类目录和页面添加斜杠(排除文章页面/内分页和自定义文章类型)

给WordPress分类目录和页面添加斜杠(排除文章页面和内分页),我们只要把以下代码加在主题目录的 functions.php 中即可:

function nice_trailingslashit($string, $type_of_url) {

if ( $type_of_url != ‘single’ && $type_of_url != ‘single_paged’ )

$string = trailingslashit($string);

return $string;

}

 

add_filter(‘user_trailingslashit’, ‘nice_trailingslashit’, 10, 2);

如果你希望页面也不要加斜杠,那么把上面其中的内容修改为

if ( $type_of_url != ‘single’ && $type_of_url != ‘page’ && $type_of_url != ‘single_paged’ )

如果你的网站还有自定义文章类型,并且自定义文章类型也不想添加斜杠,那么可以修改为

function nice_trailingslashit($string, $type_of_url) {

global $post_type;

if ( $type_of_url != ‘single’ && $type_of_url != ‘single_paged’ && $post_type !== ‘projects’  )

$string = trailingslashit($string);

return $string;

}

 

add_filter(‘user_trailingslashit’, ‘nice_trailingslashit’, 10, 2);

其中 $post_type !== ‘projects’中的 projects即为你的自定义文章类型。

wordpress批量删除及重命名自定义域栏目

wordpress通常是只可以添加和删除自定义栏目,但不能重命名。常规的方法是进数据库修改,但修改数据库有风险,下面代码可以实现免进数据库修改wordpress自定义域栏目

将以下代码添加到主题 functions.php 文件中:

global $wpdb;

$wpdb->query( "

UPDATE `wp_postmeta`

SET `meta_key` = ‘NEW NAME’

WHERE `meta_key` = ‘OLD NAME’

" );

替换上面代码中新的自定义栏目名称和原自定义栏目名称。

批量删除WordPress自定义栏目

将下面的代码添加到当前主题functions.php中:

global $wpdb;

$wpdb->query( "

DELETE FROM $wpdb->postmeta

WHERE `meta_key` = ‘自定义栏目名称’

" );

然后打开一下网站,指定删除的自定义栏目会自动从数据库中被清理掉。

上述两种功能的代码运行一次就够了,没有必要留在主题中,用后删除即可。

WordPress实现文章中远程(外链)图片自动本地化的方法

WordPress文章中远程图片自动保存到本地服务器,最大的好处就是复制粘贴,方便对文章的转载复制.

实现方法:

复制下面的代码,然后粘贴到你当前WordPress主题的模版函数(functions.php)文件中保存即可。

//自动本地化外链图片
add_filter(‘content_save_pre’, ‘auto_save_image’);
function auto_save_image($content) {
$upload_path = ”;
$upload_url_path = get_bloginfo(‘url’);
//上传目录
if (($var = get_option(‘upload_path’)) !=”){
$upload_path = $var;
} else {
$upload_path = ‘wp-content/uploads’;
}
if(get_option(‘uploads_use_yearmonth_folders’)) {
$upload_path .= ‘/’.date(“Y”,time()).’/’.date(“m”,time());
}
//文件地址
if(($var = get_option(‘upload_url_path’)) != ”) {
$upload_url_path = $var;
} else {
$upload_url_path = bloginfo(‘url’);
}
if(get_option(‘uploads_use_yearmonth_folders’)) {
$upload_url_path .= ‘/’.date(“Y”,time()).’/’.date(“m”,time());
}
require_once (“../wp-includes/class-snoopy.php”);
$snoopy_Auto_Save_Image = new Snoopy;
$img = array();
//以文章的标题作为图片的标题
if ( !empty( $_REQUEST[‘post_title’] ) )
$post_title = wp_specialchars( stripslashes( $_REQUEST[‘post_title’] ));
$text = stripslashes($content);
if (get_magic_quotes_gpc()) $text = stripslashes($text);
preg_match_all(“/ src=(\”|\’){0,}(http:\/\/(.+?))(\”|\’|\s)/is”,$text,$img);
$img = array_unique(dhtmlspecialchars($img[2]));
foreach ($img as $key => $value){
set_time_limit(180); //每个图片最长允许下载时间,秒
if(str_replace(get_bloginfo(‘url’),””,$value)==$value&&str_replace(get_bloginfo(‘home’),””,$value)==$value){
//判断是否是本地图片,如果不是,则保存到服务器
$fileext = substr(strrchr($value,’.’),1);
$fileext = strtolower($fileext);
if($fileext==””||strlen($fileext)>4)
$fileext = “jpg”;
$savefiletype = array(‘jpg’,’gif’,’png’,’bmp’);
if (in_array($fileext, $savefiletype)){
if($snoopy_Auto_Save_Image->fetch($value)){
$get_file = $snoopy_Auto_Save_Image->results;
}else{
echo “error fetching file: “.$snoopy_Auto_Save_Image->error.”<br>”;
echo “error url: “.$value;
die();
}
$filetime = time();
$filepath = “/”.$upload_path;//图片保存的路径目录
!is_dir(“..”.$filepath) ? mkdirs(“..”.$filepath) : null;
//$filename = date(“His”,$filetime).random(3);
$filename = substr($value,strrpos($value,’/’),strrpos($value,’.’)-strrpos($value,’/’));
//$e = ‘../’.$filepath.$filename.’.’.$fileext;
//if(!is_file($e)) {
// copy(htmlspecialchars_decode($value),$e);
//}
$fp = @fopen(“..”.$filepath.$filename.”.”.$fileext,”w”);
@fwrite($fp,$get_file);
fclose($fp);
$wp_filetype = wp_check_filetype( $filename.”.”.$fileext, false );
$type = $wp_filetype[‘type’];
$post_id = (int)$_POST[‘temp_ID2’];
$title = $post_title;
$url = $upload_url_path.$filename.”.”.$fileext;
$file = $_SERVER[‘DOCUMENT_ROOT’].$filepath.$filename.”.”.$fileext;
//添加数据库记录
$attachment = array(
‘post_type’ => ‘attachment’,
‘post_mime_type’ => $type,
‘guid’ => $url,
‘post_parent’ => $post_id,
‘post_title’ => $title,
‘post_content’ => ”,
);
$id = wp_insert_attachment($attachment, $file, $post_parent);
$text = str_replace($value,$url,$text); //替换文章里面的图片地址
}
}
}
$content = AddSlashes($text);
remove_filter(‘content_save_pre’, ‘auto_save_image’);
return $content;
}
function mkdirs($dir)
{
if(!is_dir($dir))
{
mkdirs(dirname($dir));
mkdir($dir);
}
return ;
}
function dhtmlspecialchars($string) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = dhtmlspecialchars($val);
}
}else{
$string = str_replace(‘&’, ‘&’, $string);
$string = str_replace(‘”‘, ‘”‘, $string);
$string = str_replace(‘<‘, ‘<‘, $string);
$string = str_replace(‘>’, ‘>’, $string);
$string = preg_replace(‘/&(#\d;)/’, ‘&\1’, $string);
}
return $string;
}

以后你发表文章时就不用去管文章中的外链图片了,因为上面的代码会自动将文章中包含的外链图片自动保存到本地.

资料来源:http://boke112.com/3452.html

WDCP面板升级PHP5.6.9、MySql5.5、Zend Guard Loader7、memcached版本过程

实用的WDCP面板升级PHP5.6.9、MySql5.5、Zend Guard Loader7、memcached版本过程分享。

第一、WDCP升级PHP5.6.9

默认WDCP安装后我们看到的PHP版本是PHP5.2.17,这个版本已经够老了,如果希望提高执行效率,一定要升级到PHP5.4以上版本。我们是否还记得前一段时间,PHP漏洞之后官方也没有提供低版本的PHP补丁,所以目前我们最好升级到PHP稳定的PHP5.6.9版本。

一键包升级方法:

wget http://soft.itbulu.com/wdcp/php_up56.sh

sh php_up56.sh

我们在已有安装WDCP默认面板的前提下,然后执行上面的脚本,整个过程时间有点长,我们SSH执行等待,然后看到成功升级的界面。

我们可以通过探针也可以看到当前已经是PHP5.6.9版本。

第二、WDCP升级MySql5.5

默认MYSQL版本是5.1.63,因为很多程序的需要,我们希望将MYSQL数据库的版本也需要升级到5.4以上,比如如今我们使用的新版WORDPRESS程序,采用的编码方式在低于MYSQL5.4下面是不兼容的,这就需要我们保持一致或者升级。在升级数据库版本之前,我们需要先备份好数据,要不出现问题就麻烦了。

wget http://soft.itbulu.com/wdcp/mysql_up55.sh

sh mysql_up55.sh

同样的,我们这里丢上脚本升级MYSQL数据库版本,在升级之前,我们如果有网站环境,最好先关闭MYSQL数据库运行,然后再执行。

执行过程中,会出现类似这样的错误:

ERROR! MySQL server PID file could not be found!
Starting MySQL. ERROR! The server quit without updating PID file (/www/wdlinux/mysql-5.5.36/data/MyCloudServer.pid).

我们就需要解决这个问题,要不我们打开网站和WDCP面板之后是出现数据库链接错误。

vi /www/wdlinux/init.d/mysqld

找到下面两行:

basedir=

datadir=

然后替换成:

basedir=/www/wdlinux/mysql-5.5.27

datadir=/www/wdlinux/mysql-5.5.27/var

或者替换成:

basedir=/www/wdlinux/mysql

datadir=/www/wdlinux/mysql/var

然后重启service mysqld start数据库才可以。这个时候数据库已经更新成5.5了,但是不懂为什么在PHPMYADMIN哈上看到的还是老版本,但是不要紧我们直接用命令看。因为WDCP的特殊性,直接用mysql -V命令查看会出现错误,我们需要先执行软连接才可以。

如果你是32位的系统:

ln -s /www/wdlinux/mysql/lib/libmysqlclient.so.18  /usr/lib/

如果你是64位的系统:

ln -s /www/wdlinux/mysql/lib/libmysqlclient.so.18  /usr/lib64/

然后我们在执行mysql -V命令,才可以看到当前VPS中的MYSQL版本。

这样,MYSQL5.5的升级已经完成。

第三、WDCP升级Zend Guard Loader(7.0版本)

这个问题之前有朋友留言需要解决的,我也答应了,只不过一直没有时间研究,这里分享出来,比较晚了,对不住了。因为在升级PHP版本之后,我们之前即便有安装过的Zend也会失效,因为不同的版本是不兼容的,这里如果我们的PHP5.6.9,那就需要安装Zend Guard7版本。

wget http://soft.itbulu.com/wdcp/zendguard7.sh
sh zendguard7.sh 5.6

执行命令,这个比较快,升级完毕之后,需要reboot重启VPS主机,才可以生效。

我们可以看到phpinfo探针中已经有Zend Guard Loader显示出来,说明已经安装完毕,而且成功

第四、WDCP升级memcached

升级PHP成新版本后,即使你原来安装过memcached的,可能也会出现memcached失效的情况,所以要再重装一下支持PHP 5.6.9的memcached版本

下载memcached_ins.sh后上传到服务器 ,执行sh memcached_ins.sh,会让你选择PHP版本,选择PHP 5.6.9,然后继续安装即可。

资料来源:http://www.itbulu.com/wdcp-upgrade-php569.html

 

脚本下载:

https://software8.ctfile.com/fs/19093-218717703

链接: https://pan.baidu.com/s/1jIgON6e 密码: a4cp

WordPress 代码实现相关文章(列表模式)功能

WordPress代码实现相关文章这个代码所实现的相关文章的相关度非常高(优先通过 Tags 标签相关,之后是同分类下文章,排除当前文章.

<h3>Related Posts</h3>
<ul>
<?php
$post_num = 5; // 數量設定.
$exclude_id = $post->ID; // 單獨使用要開此行 //zww: edit
$posttags = get_the_tags(); $i = 0;
if ( $posttags ) {
$tags = ”; foreach ( $posttags as $tag ) $tags .= $tag->term_id . ‘,’; //zww: edit
$args = array(
‘post_status’ => ‘publish’,
‘tag__in’ => explode(‘,’, $tags), // 只選 tags 的文章. //zww: edit
‘post__not_in’ => explode(‘,’, $exclude_id), // 排除已出現過的文章.
‘caller_get_posts’ => 1,
‘orderby’ => ‘comment_date’, // 依評論日期排序.
‘posts_per_page’ => $post_num
);
query_posts($args);
while( have_posts() ) { the_post(); ?>
<li><a rel=”bookmark” href=”<?php the_permalink(); ?>” title=”<?php the_title(); ?>”><?php the_title(); ?></a></li>
<?php
$exclude_id .= ‘,’ . $post->ID; $i ++;
} wp_reset_query();
}
if ( $i < $post_num ) { // 當 tags 文章數量不足, 再取 category 補足.
$cats = ”; foreach ( get_the_category() as $cat ) $cats .= $cat->cat_ID . ‘,’;
$args = array(
‘category__in’ => explode(‘,’, $cats), // 只選 category 的文章.
‘post__not_in’ => explode(‘,’, $exclude_id),
‘caller_get_posts’ => 1,
‘orderby’ => ‘comment_date’,
‘posts_per_page’ => $post_num – $i
);
query_posts($args);
while( have_posts() ) { the_post(); ?>
<li><a rel=”bookmark” href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></li>
<?php $i++;
} wp_reset_query();
}
if ( $i == 0 ) echo ‘<li>没有相关文章!</li>’;
?>
</ul>

资料来源:https://zww.me/archives/25353

使用php获取图片尺寸

在网页设计中,为图像<img>指定 height 和 width 属性是一个好习惯,至于为什么是一个好习惯,你可以点此查看文档说明。但是在动态网页中,有些图像的尺寸是不固定的,有时候你不能为图像<img>指定固定的 height 和 width 属性,那怎么办呢?其实php有现成的函数getimagesize用于获取图像的尺寸,具体的函数使用方法以及代码示例,可以点此查看php的文档,下面简单介绍一下用法:

<?php/* 1.jpg为你想获得其尺寸的图片 */
$arr = getimagesize("1.jpg");
/**
* 这里$arr为一个数组类型
* $arr[0] 为图像的宽度
* $arr[1] 为图像的高度
* $arr[2] 为图像的格式,包括jpg、gif和png等
* $arr[3] 为图像的宽度和高度,内容为 width="xxx" height="yyy"
*/
/* 以下两行代码输出的内容都是一样的 */
echo "<img src="1.jpg" $arr[3] alt="" />";
echo "<img src="1.jpg" width="$arr[0]" height="$arr[1]" alt="" />";
?>

以上php代码被解释为内容为:

<img src="1.jpg" width="xxx" height="yyy" alt="" />
<img src="1.jpg" width="xxx" height="yyy" alt="" />

资料来源:http://www.ludou.org/php-get-images-size.html