东东东 陈煜东的博客

分类存档: wordpress ( 1 / 2)

wordpress设置

分享一个阻止垃圾机器人提交留言表单算法

spam-evil

每个博客主或者网站都会受到各式各样的垃圾留言骚扰。如果网站不及时清理这些垃圾留言,那么整个网站的可读性将会变得越来越糟糕,最后完全被垃圾浏览给占领了。

现在博客使用的是 WordPress,使用的是一个官方的插件 Akismet,这个程序还不错,通过后台大数据分析来识别垃圾评论。

不过除了 Akismet,我还有安装另外一个插件,这个插件很小巧,并且我觉得思路很不错。通过这两个插件来可以过滤很多的垃圾评论。

下面说说这个插件 anti-spam 使用的算法。

这个算法是基于 2 个方法:不可见的 JS 验证码(invisible js-captcha)不可见的输入框陷阱(invisible input trap)

不可见的 JS 验证码 invisible js-captcha

不可见的 JS 验证码(invisible js-captcha)方法基于一个事实:机器人在他们的在程序中不会执行 JavaScript 代码。

所以默认在输出 HTML 评论框的时候,加入了一个隐藏的问题和输入框,问题是今年是公元 xxxx 年。

如果用户访问网站,这个输入框答案会被 JavaScript 自动回答,并且会被 JavaScript 和css 的手段隐藏起来,不让用户看到。

如果机器人去填写答案没有填写正确,那么就会被判定是垃圾信息。

作者实现很鸡贼,其实这里有两个输入框,一个输入框是正确的答案,一个输入框是错误的答案。

<p class="antispam-group antispam-group-q" style="clear: both;">
    <label>Current ye@r <span class="required">*</span></label>
    <input type="hidden" name="antspm-a" class="antispam-control antispam-control-a" value="'.date('Y').'" />
    <input type="text" name="antspm-q" class="antispam-control antispam-control-q" value="'.ANTISPAM_PLUGIN_VERSION.'" autocomplete="off" />
</p>

如果用户没有开启 JavaScirpt ,那么需要在这里情况内容,输入正确的答案。否者在后台就被判断是无效留言。

JS 自动回答答案

// 对表单答案添加答案,答案已经在 antispam-control-a 提供出来了。
elements = document.querySelectorAll('.antispam-control-q');
len = elements.length;
for (i = 0; i < len; i++) { // set answer into other input instead of user
    elements[i].value = answer;
}

...

// 这里利用 JavaScript 添加一个动态的表单
// 如果没有开启
dynamic_control = document.createElement('input');
dynamic_control.setAttribute('type', 'hidden');
dynamic_control.setAttribute('name', 'antspm-d');
dynamic_control.setAttribute('class', 'antispam-control antispam-control-d');
dynamic_control.setAttribute('value', current_year);
...
elements[i].appendChild(dynamic_control);

后台判断逻辑片段

if ( $antspm_q != date('Y') ) { // year-answer is wrong - it is spam
    if ( $antspm_d != date('Y') ) { // extra js-only check: there is no js added input - it is spam
        $spam_flag = true;
        if (empty($antspm_q)) { // empty answer - it is spam
            $antispam_error_message .= 'Error: empty answer. ['.esc_attr( $antspm_q ).']<br> '.$rn;
        } else {
            $antispam_error_message .= 'Error: answer is wrong. ['.esc_attr( $antspm_q ).']<br> '.$rn;
        }
    }
}

如果用户没有启用 JavaScript 会怎么样呢?

用户会在提交表单中看到今天是公元多少年的问题,然后需要将错误的答案修改成正确的答案。这样在上面的后台检测脚本中就会发现,这里填写是正确的。就不用再关心 JavaScript 动态的答案了。

不可见的输入框陷阱 invisible input trap

不可见的输入框陷阱(invisible input trap)是基于一个事实:大多数机器人遇到 email 或者 url 关键字表单会自动填充一些信息。

因此在评论框中增加一个隐藏字段,正常用户是看不到这个字段,所以也不会去填写它。

// 默认不展示给用户看。
<p class="antispam-group antispam-group-e" style="display: none;">
    <label>Leave this field empty</label>
    <input type="text" name="antspm-e-email-url-website" class="antispam-control antispam-control-e" value="" autocomplete="off" />
</p>

但是机器人是可以看到这个字段的,如果在这里填写了任何东西,那么就会被判定为机器人。

后台的判断逻辑片段

// 如果填写了这个表单,那么就被判定是垃圾信息了
if ( ! empty($antspm_e)) { // trap field is not empty - it is spam
    $spam_flag = true;
    $antispam_error_message .= 'Error: field should be empty. ['.esc_attr( $antspm_e ).']<br> '.$rn;
}

总结一下

目前从后台效果来看,这个插件的效果很好,很少遇到垃圾留言。

目前的一些垃圾机器人无法执行 JavaScript,所以很多利用这个特性就可以做一些排除了。很多的第三方评论都是利用 JS 展示出来了。

不过很优秀的 Disqus 在国内经常抽风,甚至不可用

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 分享一个阻止垃圾机器人提交留言表单算法 – https://www.chenyudong.com/archives/anti-spam-comments-algorithm.html

分类: wordpress

wordpress使用markdown extra插件

hello markdown!

用了一些markdown语法,发现很不错。以前博客使用的是html语言,感觉还ok,毕竟html标签用的比较少,常用的就codealitalbe这几个标签。但是在看文章的源代码的时候,那几个html标签看起来还是比较不爽的,一开一闭合,感觉很冗余。而且看文章的格式看上去不太清晰。

但是markdown就不会那样,看源码感觉就感觉整篇文章的结构依旧清晰。所以就将wordpress的结构进行修改,让其改成markdown语法。当然要支持markdown extra了。

选择、下载插件

这里的插件使用的是michelf markdown classic版本,这个版本是支持WordPress的,不要下载到PHP Markdown Lib,这个不支持WordPress的。

我上网找了一些markdown插件,发现种类繁多,不知道怎么确定,那么就是用michelf版本的好了,因为这个是我最先接触到的一个版本,有中先入为主的观点。

安装

这个插件安装就更简单了。

  • 下载来就一个文件markdown.php,将其放到(site home)/wp-content/plugins/目录。
  • 进入到WordPress后台,启用该插件。
  • 禁用可视化编辑器。进入到WordPress管理后台,用户->{选择一个用户}->可视化编辑器,勾选撰写文章时不使用可视化编辑器

然后就去尝试一些使用markdown撰写你的文章吧~

与语法高亮插件兼容

该插件和以前的文章兼容较好,但是发现和SyntaxHighlighter Evolved语法高亮插件有些不兼容,代码部分出现一些多余的标签。

markdown.php源码中有下面这个

add_filter('the_content',     'mdwp_MarkdownPost', 6);
add_filter('the_content_rss', 'mdwp_MarkdownPost', 6);
add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6);

这个是markdown的SyntaxHighlighter的优先级有不一样,SyntaxHighlighter的是7,所以我把markdown的语法调成8了。

add_filter('the_content',     'mdwp_MarkdownPost', 8);
add_filter('the_content_rss', 'mdwp_MarkdownPost', 8);
add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 8);

文章中编写代码

要想文章中插入代码,不能使用markdown的语法,还是得使用SyntaxHighlighter的语法,毕竟SyntaxHighlighter有自己的语法规则。

所以上面的语法高亮还是这么使用:

[c0de language="php"]
add_filter('the_content',     'mdwp_MarkdownPost', 10);
add_filter('the_content_rss', 'mdwp_MarkdownPost', 10);
add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 10);
[/c0de]

原谅我文中使用c0de代替code,因为插件嵌套工作不好呀。

参考

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: wordpress使用markdown extra插件 – https://www.chenyudong.com/archives/wordpress-install-markdown-plugin.html

分类: wordpress

手工升级wordpress

以前的wordpress版本比较老,最近有新的版本升级了,想尝试一下。

因为之前有一些对wordpress的改动,还有主题的修改,所以不想让wordpress自动进行升级,而是自己升级文件,让wordpress升级数据库。

第一步:备份数据库、文件。

第二步:关闭所有的插件,这个最好还是先关闭然后再开启吧。

第三步:下载最新版的wordpress。然后解压缩到一个目录下。

第四步:替换wp-adminwp-includes这两个目录。复制新版根目录的所有文件到原先的目录(除了wp-config.php这样就不用修改数据库了)。

第五步:进入http://博客地址/wp-admin/upgrade.php,进行升级数据库。

一下下,博客就升级好了。

曾经以为只要把文件变成最新版的,wordpress可以使用老的数据库,然后自动升级,没想到失败了,原来是少了第五步,升级数据库,然后才能升级wordpress成功。但是,发现一个很长时间没管的js文件丢失了,还好有备份^_^

接下来你可能需要再次对wordpress做一些修改。比如:

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 手工升级wordpress – https://www.chenyudong.com/archives/upgrade-wordpress-manual.html

分类: wordpress

Nginx上搭建WordPress及配置 完美迁移

昨天晚上20点,空间的带宽达到上限了,本来1个月才2G的流量,现在20天就跑5G,23点才发现网站不能访问。赶紧将www.daoiqi.com域名解析转成日本的Linode服务器上,但是博客却还没有迁移,因为要在Nginx上搭建WordPress比较麻烦,需要配置一些东西。

今天趁着零碎的时间,终于把博客给迁移到Nginx上了。这篇文章是参考http://codex.wordpress.org/Nginx,官网给出的配置,我这里没办法使用,但是我已经解决了。

第一步:上传代码

将代码上传到服务器,目录/data/www/chenyudong.com/wwwroot

第二步:设置Nginx.conf

修改nginx.conf文件,它可能在/etc/nginx/nginx.conf或者/usr/local/nginx/conf/nginx.conf下,看你的具体情况。本文假定在/usr/local/nginx/conf/nginx.conf目录下。

# Generic startup file.
user {user} {group};

#ususally equal to number of CPU's you have. run command &amp;amp;amp;quot;grep processor /proc/cpuinfo | wc -l&amp;amp;amp;quot; to find it
worker_processes  2;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

# Keeps the logs free of messages about not being able to bind().
#daemon     off;

events {
    worker_connections  1024;
}

http {
#   rewrite_log on;

    include mime.types;
    default_type       application/octet-stream;
    access_log         /var/log/nginx/access.log;
    sendfile           on;
#   tcp_nopush         on;
    keepalive_timeout  3;
#   tcp_nodelay        on;
#   gzip               on;
        #php max upload limit cannot be larger than this
    client_max_body_size 13m;
    index              index.php index.html index.htm;

    # Upstream to abstract backend connection(s) for PHP.
    upstream php {
        #this should match value of &amp;amp;amp;quot;listen&amp;amp;amp;quot; directive in php-fpm pool
        #server unix:/tmp/php-fpm.sock;
        server 127.0.0.1:9000;
    }

    include sites-enabled/*;
}

对着你的Nginx.conf的配置,参考一下这个配置

  • 其中33~37行,这个是php-fpm的一些设置,php-fpm是运行php用的一个cgi,一般都用这个;
  • 第39行,这个是为了添加多个站点使用的,以后新增站点就不用修改nginx.conf,直接在sites-enabled目录下添加一个nginx的配置即可

我的机器上,只有监听127.0.0.1:9000端口进行php的处理,没有/tmp/php-fpm.sock这个sock,所以我将上面的一行给注释了。如果没有注意到,这里会出现403 Forbidden的错误。

每个站点的设置

你肯定是有多个站点的吧,不可能装一个nginx就跑一个网站。新建一个文件/usr/local/nginx/conf/sites-enabled/chenyudong.conf。注意文件的位置,是在conf/sites-enabled目录下面。

# Redirect everything to the main site. We use a separate server statement and NOT an if statement - see http://wiki.nginx.org/IfIsEvil
server {
        server_name  _;
        rewrite ^ $scheme://mysite.com$request_uri redirect;
}

server {
    server_name www.chenyudong.com;
    root /data/www/chenyudong.com/wwwroot;

    include global/restrictions.conf;

    # Additional rules go here.

    # Only include one of the files below.
    include global/wordpress.conf;
#   include global/wordpress-ms-subdir.conf;
#   include global/wordpress-ms-subdomain.conf;
}

我们注意到11行include了一个文件,17行include了一个文件。这两个文件因为比较具有通用性,所以将其单独提取出来,方便以后多个站点进行include,减少重复的编写。

第三步:编写restrictions.conf

新建一个文件夹/usr/local/nginx/conf/global/,并在这个目录下新建一个文件restrictions.conf,绝对路径为/usr/local/nginx/conf/global/restrictions.conf。

这个配置是给限制一些文件的访问的。

# Global restrictions configuration file.
# Designed to be included in any server {} block.&amp;amp;amp;lt;/p&amp;amp;amp;gt;
location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /\. {
    deny all;
}

# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

文件说明:

  • 比如favicon.ico这个文件,一个网站的icon,就不用访问日志了,打出来也是浪费。robots.txt这个文件是给搜索引擎看得,也没必要打log
  • .开头的隐藏文件也禁止访问,这里面有重要的信息,比如 .htaccess, .htpasswd, .DS_Store (Mac).
  • uploads或者files下的php禁止访问,通常这个目录的意义是用户上传的一些文件,为了保证安全,防止用户上传可运行的脚本,禁止其访问。

通用的WordPress设置,配置文件

# WordPress single blog rules.
# Designed to be included in any server {} block.

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
    index        index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
}

# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
    # Zero-day exploit defense.
    # http://forum.nginx.org/read.php?2,88845,page=3
    # Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
    # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine.  And then cross your fingers that you won't get hacked.
    try_files $uri =404;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#   fastcgi_intercept_errors on;
    fastcgi_pass php;
}

注意到第7行,指明默认的首页的文件名是什么。我之前没有这一样,在nginx.conf里,也没有为站点做设置,结果访问http://www.chenyudong.com/index.html跳转到了http://www.chenyudong.com/,但是因为没有指定index的文件,导致又一个403 Forbidden错误。

第8行,try_files这个命令相当于做一个url重写,可以利用它来做一个伪静态。try_files $uri $uri/ /index.php?$args,$uri是nginx的一个变量,他的意义是先查看一下uri这个文件是不是存在,存在就返回,不存在就检查uri/这个目录看是否存在,存在返回,不存在查看index.php?$args这个是不是存在,如果不存在就返回默认的错误码,一般是404错误。

确认是否需要更改数据库密码

从其他的地方迁移过来,检查一下是否需要更改数据库的用户名和密码,在文件/wp-config.php,可以更改博客的数据库用户名和密码。

重启nginx

重启一下nginx,准确的说应该是重新读取一下配置。/usr/local/nginx/sbin/nginx -s reload

访问一下http://www.chenyudong.com/就可以了,而且原有的重写规则还是可以用的。

参考文章:http://codex.wordpress.org/Nginx

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Nginx上搭建WordPress及配置 完美迁移 – https://www.chenyudong.com/archives/nginx-support-wordpress-and-configure.html

分类: wordpress, 网站建设

在WordPress使用query_posts应该小心

如果对WordPress中的页面进行修改,那么在使用query_post()方法要小心了。可能会造成不希望看见的后果。我就因为这个而悲剧了1小时。

当我在给首页增加分类文章的时候,我使用了query_post()方法,来获取分类目录下的最新文章。ok,这一切都很正常,文章也能显示。但是在首页的页尾发现有连个js文件没有显示。

我以为我的某些修改出现了问题,我就依次的向前恢复,一直都没用。最后我使用原始未修改过的版本来进行。然后再添加分类文章,发现原来是添加分类文章出现的问题。我又一行行的排查,发现是使用query_post()造成的问题。

由于使用了query_post(),导致下文的一些东西没显示出来。就是这个事情,花了1小时的时间。

一个小例子

<?php query_posts("showposts={$newsNumber}&cat={$categoryID}"); ?>
<?php while (have_posts()) : the_post(); ?>
<li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
 <?php endwhile; wp_reset_query();?>

我们来看看官方的query_post()的文档,query_post()是最简单,但不是最高效的。query_posts() 会改变主查询,并不被推荐,除非有必要才使用。在使用query_posts() 后,记得在循环结束的时候,调用wp_reset_query()才行。wp_reset_query() 恢复 $wp_query 和 global post data to the original main query。

所以,在调用的时候要注意。

一些替代的方法

可以使用 WP_Query 或者 use get_posts()替代一些查询,这样会更好一些。

我还是继续先使用query_posts()来解决我的问题吧。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 在WordPress使用query_posts应该小心 – https://www.chenyudong.com/archives/using-query-posts-should-be-cautious-in-wordpress.html

分类: wordpress

为WordPress文章页面增加修改时间

WordPress文章只显示文章的发布信息,但是文章的更新信息没有显示。他人无法知道这篇文章是否还有效,可信度是否较高。

虽然WorPress自带一个get_the_modified_date()和get_the_modified_time()显示的修改文章的时间。有时候,文章是定时发布的,外后推迟发布的话,会出现修改时间会大于发布时间。这不是想要的。

动手增加修改时间

1.模板页中的content-single.php中在喜欢的位置添加

<!--?php twentyeleven_updated_on(); ?-->

2.在模板functions.php中添加以下代码,判断修改时间是否大于发布时间,总之要显示时间大的那个。

if ( ! function_exists( 'twentyeleven_updated_on' ) ) :
function twentyeleven_updated_on() {
    $postDate = strtotime( get_the_date( 'c' ) );  
    $updateDate = strtotime( get_the_modified_date('c') );
    $showTime = $updateDate >  $postDate ? $updateDate : $postDate;
    
     
    printf( __( '<div class="last-updated" style="color:grey;font-size:14px"><span class="sep">已更新 </span><time class="entry-date" datetime="%1$s" updatedate>%2$s</time></div>', 'twentyeleven' ),
        esc_attr(date("c", $showTime)),
        esc_html(date("Y/m/d", $showTime ))
    );
}
endif;

具体的时间参数可以查看http://codex.wordpress.org/Formatting_Date_and_Time

3.打开文章页面,见文章底部,显示的结果为

已更新 2013/01/31

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 为WordPress文章页面增加修改时间 – https://www.chenyudong.com/archives/add-modified-time-for-wordpress-article.html

分类: wordpress

wordpress使用syntaxhighlighter语法高亮插件

更换Wordpress语法高亮显示工具为SyntaxHighlighter。

原先使用的wp code 不好用,输出到rss阅读器的php代码会出现排版问题。

去除部分SyntaxHighlighter支持的语言

对于一些用不上的语言,注释之。在/wp-content/plugins/syntaxhighlighter/syntaxhighlighter.php 文件中

注释的语言有

as3
coldfusion
clojure
delphi
erlang
fsharp
groovy
powershell
r
ruby
scala
vb

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: wordpress使用syntaxhighlighter语法高亮插件 – https://www.chenyudong.com/archives/wordpress-syntax-highlight-plugin-syntaxhighlighter.html

分类: wordpress

将WordPress的搜索替换成Google自定义搜索

为了减小后台的压力,将搜索功能使用Google自定义搜索引擎功能替换。这样也不会浪费Google的强大的搜索功能嘛。这里使用的是Google自定义搜索引擎的托管页面。

如果没有Google 自定义搜索,那么可以去申请一个。每个搜索引擎都有一个自己的id值,需要这个id值。在搜索引擎结果页面上可以少量修改外观,还可以赚钱呢,更多功能好好去探索吧。

查看Wordpress后台代码,发现使用了get_search_form()获得搜索框,上官网搜索所在文件,在/wp-includes/generate-template.php。但是在文件中的get_search_form()修改在我的主题下不起效果。

后来经过搜索在/wp-content/themes/twentyeleven/searchform.php中修改,这下可以使用了。

源文件中的表单如下:

<form id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>" method="get">
<label class="assistive-text" for="s"><!--?php _e( 'Search', 'twentyeleven' ); ?--></label>
 <input id="s" class="field" type="text" name="s" />
 <input id="searchsubmit" class="submit" type="submit" name="submit" value="<?php esc_attr_e( 'Search', 'twentyeleven' ); ?>" />
</form>

修改为

<form id="searchform" action="http://www.google.com/cse" method="get"><label class="assistive-text" for="s"><!--?php _e( 'Search', 'twentyeleven' ); ?--></label>
 <input id="s" class="field" type="text" name="q" />
 <input type="hidden" name="cx" value="002842556423191659620:3mb-gtj3uvw" />
 <input type="hidden" name="ie" value="UTF-8" />
 <input id="searchsubmit" class="submit" type="submit" name="submit" value="<?php esc_attr_e( 'Search', 'twentyeleven' ); ?>" />
</form>

其中的input中name=cx的value值为id值,ie为页面的编码。

这样在使用搜索框搜索时,就自动转入Google的自定义搜索页面进行搜索了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 将WordPress的搜索替换成Google自定义搜索 – https://www.chenyudong.com/archives/replace-wordpress-dufault-search-with-google-hosted-custom-search.html

分类: wordpress

目录category和标签tag使用相同的别名

今天看见标签”linux”的别名是”linux-2″,看着这个url很别扭,需要将其改正。于是在后台”文章”,”标签”中进行修改,显示别名已经被使用,无奈。但是发现ubuntu在分类目录和标签中都一样,没有冲突。于是就自己探索着怎么修改。

有两种方法可以让”分类目录(category)”和”标签(tag)”的别名一样。

第一种方法,在”分类目录”中添加目录,只写名字和别名就行了,描述就先不写了,然后在”标签”中添加一个标签,名字和别名和目录中的一样,这样创建的标签就使用的是分类目录是同一个对象了(即引用数据库中表”wp_terms”中的同一行记录)。

第二个方法是,在数据库中进行更改。

表”wp_terms”表中存放这是”分类目录(category)”和”标签(tag)”的记录,在这里是不能区分这两个的哪个是标签哪个是目录的。只有在表”wp_term_taxonomy”中数据才是区分”分类目录”(category)和”标签”(post_tag)。

表wp_terms结构
term_id name slug term_group
11 Linux linux 0

看看表wp_terms的结构。

"term_id":表wp_terms的主键(Primer Key)索引值,在其他表中可以引用这个值作为外键。
"name":该记录(关系)的名字,用于显示其名字。不做链接使用。
"slug":该记录的别名,仅在在url中显示。
"term_group" :目前还不知道。
表wp_term_taxonomy结构
term_taxonomy_id term_id taxonomy description parent count
11 11 category 0 0
36 11 post_tag 0 0

具体看看表wp_term_taxonomy的结构。

"term_taxonomy_id":为表"wp_term_taxonomy"的主键(Primer key),这个表中的索引值,不能有重复。
"term_id":表"wp_terms"的引用,他的取值只能在表"wp_terms"中取值。
"taxonomy":表示分类的意思,"category"表示这条记录(关系)是"分类目录(category)",的意思。而"post_tag"表示的是这条记录(关系)是"标签(tag)"的意思。
"description":用于表示该记录的详细信息,具体描述目录或者标签。
"parent":分类目录(category)的父目录,对文章标签(post_tag)则无效。
"count" :该记录被文章的引用次数。

我们只要将表wp_term_taxonomy中的两条记录的”taxonomy”对应的category和post_tag中的term_id指向统一个对象,那么”分类目录”和”标签”就使用统一个对象了,因此他们的别名也就相同了。

———————-update on 11th July———– 发现原来是之前的name使用的是大写,后台在tag中输入的是小写,导致两个不一样,所以就出现了不同的两个id,我还是直接对数据库进行更改的。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 目录category和标签tag使用相同的别名 – https://www.chenyudong.com/archives/category-and-tag-use-same-slug.html

分类: wordpress

wordpress更改自定义rss feed地址

为自己的RSS地址做了一个改变,从之前的http://www.chenyudong.com/feed/变成了http://feed.chenyudong.com/,这样我改变RSS托管商,在域名中改变cname而不用改变我的RSS输出地址,就可以便捷的更换不同的RSS托管商了。

在此之前搜了很多改变RSS地址的文章,发现均不管用。这边文章发表时使用的是WordPress 3.3.1版本,好多文章使用的比我老的版本做的测试。

直接更改header.php的输出

网络上有说更改{themes}/header.php文件中的以下代码。

<link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss2_url'); ?>" />
//更改为以下方式
<link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="http://feed.chenyudong.com/" />

但是这种修改方法这我的这个版本中没有,这个应该是老版本吧。

更改get_bloginfo中的输出

还有说更改wp-includes/general-template.php文件中的get_bloginfo()函数中的代码。

case 'rss2_url':
    $output = get_feed_link('rss2');//将这个替换了
    break;
//更改为以下
case 'rss2_url':
    $output = 'http://feed.chenyudong.com/';
    break;

这个修改的效果是在WordPress侧边栏的RSS地址中出现改变了,不是在中发生变化。所以此方法也无效。

在functions.php中添加过滤器

在主题下{themes}/functions.php中末尾添加以下代码。

add_filter('feed_link','custom_feed_link', 1, 2);

function custom_feed_link($output, $feed) {

    $feed_url = 'http://feed.chenyudong.com/';
    //具体可以更改以下的不容feed的链接
    $feed_array = array('rss' => $feed_url, 'rss2' => $feed_url, 'atom' => $feed_url, 'rdf' => $feed_url, 'comments_rss2' => '');
    $feed_array[$feed] = $feed_url;
    $output = $feed_array[$feed];

    return $output;
}

//然而目录、作者、标签的feed地址都和上面的相同,你可能需要添加以下的方法
add_filter('category_feed_link', 'other_feed_links');
add_filter('author_feed_link', 'other_feed_links');
add_filter('tag_feed_link','other_feed_links');
add_filter('search_feed_link','other_feed_links');

function other_feed_links($link) {
    $link = 'http://feed.chenyudong.com/other';
    return $link;
}

可以根据需要在$feed_array数组中更改具体的rss地址,这个修改方法有效,在首页头部<head></head>中正确出现。

通过rewrite改写功能来实现feed地址改变

为子域名http://feed.chenyudong.com/建立一个空间,在根目录中的.htaccess文件中添加以下代码,重写url规则改变地址。

RewriteRule . http://feed.feedsky.com/chenyudong [L]

缺点就是比较麻烦,要给子域名创建空间,网上说301重定向只有Google Reader能识别,其他的像鲜果、抓虾、豆瓣无法识别。优点更换便捷,比用cname自由度高,能对feed.chenyudong.com有更多的使用权。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: wordpress更改自定义rss feed地址 – https://www.chenyudong.com/archives/wordpress-change-rss-feed-url-with-custom-url.html

分类: wordpress

较早的文章

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑