据说新版的WordPress自带电台功能

今日将WP升级到3.9.1,主要为了看看一些媒体方面的新功能,如支持HTML5的播放器、摄影图集等。

对于音乐播放器测试的known issues:

1、自带播放器的js在主题模板末尾,故前面如果出现js错误则播放器可能不会正确加载。
2、Firefox 28开始脑残地取消了对AAC的支持(这是个杯具),造成全世界99.9%的MP4音频视频无法播放。

再次对付WordPress文章ID

我严重怀疑这个ID是WordPress开发者故意弄的,这个这个这个必须是逼疯强迫症病人的大杀器啊。。。

曾几何时为了这个文章ID做了不知多少事:
关闭Revision
关闭Auto Draft
冒着丢失几千字的风险关闭自动保存
甚至不惜影响交叉链接和搜索引擎收录而完全重排文章,几乎相当于重新建站

然而最近三观又有改变,喜欢简约风格,把主题给换了不说,而且还不再用Live Writter写文章了而改用dashboard里的在线编辑器。用这个当然不敢再一直冒风险关着自动保存,所以又把保存给打开了。而这样可能过几天发现ID又会呼啦一下跳很多了。所以今天决定再次对付一下文章ID的问题。

我的主要强迫症除了ID连续外,还觉得清理过无用revision后那些释放出来的ID为什么不能重新利用起来。所以我打算实现一下“从不连续的地方开始插入文章”这个目标。显然这个patch需要写的很底层,应该在距离执行sql insert最近的地方。经过对代码的一些阅读,最后决定直接patch在wp-db.php上。

	function insert( $table, $data, $format = null ) {
		//PATCHED BY LXF: Reset Autoincrease
		if ($table == $this->posts) {
			$insId = $this->get_var("SELECT ID+1 FROM $this->posts a WHERE NOT EXISTS (SELECT ID FROM $this->posts WHERE ID = a.ID + 1) LIMIT 1");
			//$this->query("ALTER TABLE $this->posts AUTO_INCREMENT = $insId");
			$data['ID'] = $insId;
		}
		return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' );
	}

开始写的是注释掉的那句ALTER,但是测试发现当前版本的MySQL不能将AUTO_INCREMENT改为小于表中已有数据最大ID的数字。我记得以前似乎是没有这个限制的,因为我曾经遇到过存在与AUTO_INCREMENT数字相等的记录导致insert永远失败的例子。

这样修改后凡是往wp_posts表里插入数据,均会取最小可插入的ID插入数据。读者可以发现这篇文章的ID已经变成了130多号而不是290号左右。先这么试用着,如果有兼容性问题再来改正。

参考文章:
WordPress 文章 ID 连续之终极方法

WordPress 3.4.2、3.5文章ID连续方法—禁用自动草稿、自动保存和文章修订

(总结)重排文章与评论ID

20141118:当前博主使用的WP版本在wp-config.php中关掉Revision后依旧会在修改旧文章时出现由于Autosave导致的Rev,这部分需要手动删除。

本文适用于受不了ID跳号的重度强迫症患者,用以将文章和评论的ID完全从1开始排序。

警告:重排文章ID会导致搜索引擎索引完全失效,下面虽然会介绍一个跳转方法,但依旧非常不建议进行这个操作!

重排文章ID:

create table post_map(id int auto_increment primary key, oldid int unique key);
insert into post_map(oldid) select id from wp_posts order by id asc;
update wp_posts set id = (select id from post_map where oldid = id);
update wp_comments set comment_post_id = (select id from post_map where oldid = comment_post_id);
update wp_postmeta set post_id = (select id from post_map where oldid = post_id);
update wp_term_relatioships set object_id = (select id from post_map where oldid = object_id) where term_taxonomy_id in (select term_taxonomy_id from wp_term_taxonomy where taxonomy != 'link_category');

评论重排:

create table comment_map (id int auto_increment primary key, oldid int unique key);
insert into comment_map (oldid) select comment_id from wp_comments order by comment_id asc;
update wp_comments set comment_id = (select id from comment_map where oldid = comment_id);
update wp_comments set comment_parent = (select id from comment_map where oldid = comment_parent) where exists (select id from comment_map where oldid = comment_parent);
update wp_commentmeta set comment_id = (select id from comment_map where oldid = comment_id) where exists (select id from comment_map where oldid = comment_parent);

对于搜索引擎的失效,可以在旧ID有、新ID没有的情况下做跳转,但对于新旧不同的只好任由文不对题,可以在文章里加行字“如果你发现文章不对,点击访问新地址”,由读者判断。附当时的博主的一段代码参考:

<?php
mysql_connect('localhost', '********', '********');
mysql_select_db('wordpress');
if (defined('WP_USE_THEMES'))
{
    if (preg_match('/^\/(\d+)$/', $_SERVER['HTTP_X_REWRITE_URL'], $matches))
    {
        $p = $matches[1];
        $result = mysql_query('select ID from wp_posts where ID = ' . $p);
        if (mysql_num_rows($result) == 0)
        {
            header('Location: http://lxf.me/old.php?p=' . $p, true, 301);
            exit();
        }
    }
}
else
{
    $p = $_GET['p'];
    $result = mysql_query('select id from post_map where oldid = ' . $p);
    $row = mysql_fetch_assoc($result);
    header('Location: http://lxf.me/' . $row['id'], true, 301);
    mysql_free_result($result);
}
mysql_close();

关闭WordPress revision功能

两年前刚开博的时候就发现文章的id不连续,觉得是自动保存草稿的原因,跳号也不厉害,就没去理它,结果今天突然看到跳了100多个号,我是今天早上把所有的文章都添加了tag不错,但也不至于这么夸张吧,所有修改一个小小问题都要存草稿难道?上网一查,原来不是草稿而是revision版本。。。这下就不能不管了,好不容易弄这么短的地址别没折腾几次就到1000了。。

revision在后台没有关闭的选项,需要在wp-config.php中添加:

define(‘WP_POST_REVISIONS’,false);

然后是清理多余内容的时候了。进phpMyAdmin,执行sql:

DELETE FROM wp_postmeta WHERE post_id IN (SELECT id FROM wp_posts WHERE post_type = ‘revision’);
DELETE FROM wp_term_relationships WHERE object_id IN (SELECT id FROM wp_posts WHERE post_type=’revision’);
DELETE FROM wp_posts WHERE post_type=’revision’;

这样即解决。不过看到已经快到600的几篇文章确实不爽,考虑到刚改域名搜索引擎还没爬到,干脆把最后几个id号给改了算了。不过这样动的手术比较大,几乎涉及所有的表,几经纠结终于改好,最后将post表的AUTO_INCREASEMENT的值设为当前最大值加一。

简析wordpress与discuz、smarty模板技术的根本区别

近日了解了下php的模板技术,准备在接下来的要做的程序中使用。因为是团队合作,需要将代码和界面并行开发,故需运用模板技术。稍稍有些困惑是采用discuz、smarty一类的模板技术好呢还是采用wordpress一类的好呢。今天上课开小差时突然领悟,两者是有根本区别的。

discuz、smarty一类的模板是比较纯正的html文件,中间需要填充的数据一般用{标识符}表示,php中使用正则表达式分析然后输出。

wordpress的模板是也是html,但需要填充的数据直接采用php标签,如在显示文章点击量的地方写上<?php echo wp_views();?>。

看似区别不大,实质上想通了会发现,两个方案刚好是置标脚本语言的两种基本形式的演化。

大家应该能记得,一切的服务器脚本,无论是asp、php、jsp,都有两种基本但对立的写法。

一种是嵌入标签,如

<HEAD>
<TITLE>
<?php echo "This is the title";?>
</TITLE>
<BODY>
<?php echo "This is body";?>
</BODY>

另外一种就是完全页面输出,如

<?php
echo "n";
echo "n";
echo "This is the titlen";
echo "n";
echo "n";
echo "This is bodyn";
echo "";
?>

两种方法各有利弊,嵌入标签方便界面和逻辑分离,方便修改界面,但在程序逻辑方面并不好控制;完全输出很容易控制程序,但界面无法维护。

为了改善这种状况,同时也为了满足用户换主题的需求,模板技术出现了。

wordpress采用嵌入标签,为了弥补程序流程难以控制的问题,其采用了后台先准备好数据,然后include主题模板,模板中通过调用前面提供的接口函数来取得数据显示出来。

discuz、smarty是真正意义上的模板技术,即读取模板文件,然后通过正则表达式替换等处理,最后生成页面统统echo出来。

具体使用哪种方法,呵呵,还是看个人喜好和团队情况咯。

嵌入标签简单易用,开发方便,但要求界面开发人员稍稍懂一点php。

tpl模板技术灵活性高,界面与代码之间耦合度很低,界面人员也不用懂php,应该是很好的设计模式,但程序复杂,模板处理执行速度慢。

以上为个人见解,因为cache童鞋赶脚这个blog会变成音乐blog,特发此技术文给大家换换口味~