从零创建WordPress自定义插件

序曲


使用 Wordpress统计插件 WP Statistics之后,经常会出现某个IP的访问突然出现比较多的情况,那么这个时候就需要了解这个IP访问的是哪个页面,是否发生了访问攻击。但是遗憾的是, WP Statistics并没有根据IP地址查询访问记录的功能,因此,我们就自己写一个查询插件好了。

创建插件的文件和文件夹


Wordpress插件存储在 wp-content/plugins/文件夹中,而我们的新建文件也要存放在这个文件夹中。一般情况下,如果所制作的插件非常简单,可直接把所有代码放在一个 PHP文件中,然后把其放在 wp-content/plugins/文件夹中。但是,我们这里要制作的插件要使用两个文件(一个是主要的插件文件,另一个为执行管理页面的文件),因此,我们需要把新创建的文件另放在一个文件夹中,我们这里把这个文件夹命名为 wp-statistics-visitor-query

创建插件的功能文件


我们就要创建插件主要文件了,我们把其命名为 wp-statistics-visitor-query.php。当然,你也可把其命名为其它名称,这并不重要。

然后再文件的头部增加插件的描述信息,如果不增加描述信息, Wordpress是找不到这个插件的。增加的内容如下:

这样操作完成后,就可以在插件管理界面中找到名字为" WP Statistics Visitors Query"的插件了。

使用行为钩子(Action Hook)


虽然插件现在已在管理面板显示,但是由于它只含有 header信息,因此它并没有其它功用。现在,我们就来增加它的功能吧。
Wordpress允许用户把插件代码放在模板的任意位置,包括页面的空间位置及页面创建过程中的逻辑位置。在此,我们将进一步了解后者,逻辑位置——即行为钩子。

行为钩子

我们可把行为钩子视为回调函数。 Wordpress执行某项操作时,如,显示页脚,它就会让插件来执行自己的代码并且要在确切的时间运行。
为了方便大家理解,我们以 my_plugin这个普通插件为例,当系统显示页脚时,这个插件就会执行 mp_footer()函数。因此,显示页脚时,使用名为 add_action()这个特殊的函数,我们就会告知 WordPress调用 mp_footer()函数:

add_action()函数把行为钩子名称作为其第一个参数,同时把必须执行的函数名称作为其第二个参数。我们将把此函数调用添加到插件的主要文件(即包括 header信息的文件),通常把它放在需要执行的函数代码正下方(本例中即放在 mp_footer()下)。可在 Wordpress Codex查看所有可用的行为钩子 。

创建插件管理页面

我们要先创建新菜单条目并把其放置在设置菜单中。

Wordpress提供了新建菜单可调用的钩子(即 admin_menu),因此,这也是我们创建菜单条目的最佳地点。

既然已确认需使用的行为钩子,我们接着就要定义行为钩子运行时要调用的函数了,我们把其称为 visitors_query_admin_actions()。代码显示如下:

正如您所看到的,我们已创建了 visitors_query_admin_actions()函数,并用 add_action()函数让其与 admin_menu行为钩子结合。接下来,我们就要给 visitors_query_admin_actions()函数添加一些代码以创建真正的菜单条目了。

WordPress其它许多操作类似,添加新菜单条目也非常简单,只需调用一个函数就可完成!把新菜单条目添加到设置菜单需要使用 add_options_page()函数,然后把以下代码添加到 visitors_query_admin_actions()函数中。

此时刷新管理页面,设置页面下就已包括新建菜单条目了。
QueryVisitorFromIP
WordPress中的每个菜单都使用不同的函数来添加其子菜单条目。例如,如果要给工具添加子菜单条目,我们就应该使用 add_management_page()函数,而非设置页面使用的 add_options_page()。更多信息,请查看 Wordpress Codex中的添加管理菜单
重新回到新添加的代码,或许您已注意到了最后一个参数。它即是请求新增菜单条目时,系统将调用的函数,我们也将使用它来创建插件的管理页面。
我们最好把此页面功能放在单独的文件中,并给其命名为 query_visitor_import_admin.php

此时点击设置菜单下的链接,系统将显示空白页面,这是因为 query_visitor_import_admin.php文件现在没有任何内容。
接下来我们配置页面中的内容,如下:

如此调整之后,需要禁用一下插件,然后再启用,否则可能不会生效。

代码详解


熟悉HTML和PHP的人都会理解以上代码,但我们这里仍将简单解释一下。

  • 我们首先用 wrap类创建一个 div,它是一个标准的 Wordpress类,使新建页面能够和 WordPress管理版块的其它页面风格一致。
  • 表单将使用 POST方法回发数据。这意味着表单数据将由同一页面接收,这样以来,我们就可添加数据库更新代码到同一文件。
  • 查询数据库的时候使用 Wordpress自带的全局数据库对象 $wpdb来访问数据库。

参考链接


从零创建WordPress自定义插件

WordPress 4.5升级到PHP7之后执行插件升级报错“无法定位WordPress内容目录(wp-content)”

WordPress 4.5升级到 PHP7之后执行插件升级报错,

如下图所示:WordPres_wp-content

这个是由于 PHP升级之后,有些函数的支持出现了变化,导致调用失败。

目前已知的修复方法是修改 wp-admin/includes/class-wp-filesystem-ssh2.php中的如下的几个函数:

修改为:

参考链接


Work around PHP7 php-ssh2 breakage

WORDPRESS 4.5 后台/登录页面强制HTTPS

这段时间貌似服务器经常被人攻击,由于服务器已经支持HTTPS登陆,而全站SSL加密又不是那么迫切,遂考虑后台SSL加密,强制HTTPS。
设置方法如下:
修改 wp-config.php

之前(貌似放在后面也可以),加

就能使得后台强制加密了;
而加入一行

就可以使登录页面强制加密了。

使用WordPress的子主题功能修改你的WordPress主题

相信很多朋友使用的WordPress主题都经过了自己的一些修改,好不容易折腾好了,主题的升级版发布了,要不要升级呢?升级以后,还得重新再次修改?郁闷啊!

其实,你大可不必如此烦恼,使用Wordpress的子主题功能,一切问题都可以迎刃而解!

WordPress 子主题简介

WordPress子主题也是一个主题,它继承了另一个主题——父主题——的功能,并允许你对父主题的功能进行修改,或者添加新功能。

创建一个子主题是很简单的。创建一个目录,将格式编写正确的 style.css 文件放进去,一个子主题就做成了!

只需要对 HTML 和CSS 具有基本的了解,您就可以通过创建一个非常基本的子主题 来对一个父主题的样式和布局进行修改和扩展,而不需要对父主题的文件作任何修改。

通过这样的方式,当父主题被更新的时候,您所做的修改就可以保存下来。

因为这个原因,我们强烈推荐您使用子主题的方式来对主题进行修改。

如果您对PHP, WordPress Templates,和 WordPress Plugin API有个基本的理解,理论上来讲,您可以使用子主题对父主题的每一个方面进行扩展,而不需要对父主题的文件进行任何修改。

本文将说明如何创建一个基本的子主题并解释您能用它来干什么。本文将使用 WordPress 3.0 的默认主题 Twenty Ten 作为父主题进行举例说明。

目录结构

子主题放在wp-content/themes目录下属于自己的目录里。下面的结构显示的就是子主题和它的父主题(Twenty Ten)在典型的WordPress目录结构中的位置:

  • public_html
    • wp-content
      • themes (主题存放的目录)
        • twentyten (示例中父主题Twenty Ten的目录)
        • twentyten-child (子主题存放的目录,可以任意命名)
          • style.css (子主题中不可或缺的文件,文件名必需为 style.css)

这个文件夹里面可以少至只包含一个style.css文件,也可以包含多至一个完整WordPress主题所拥有的文件:

  1. style.css (必需)
  2. functions.php (可选)
  3. Template files (可选)
  4. Other files (可选)

让我们看看它们是如何起作用的。

必需的style.css文件

style.css是一个子主题唯一必须的文件。它的头部提供的信息让WordPress辨认出子主题,并且重写父主题中的style.css文件

对于任何WordPress主题,头部信息必须位于文件的顶端,唯一的区别就是子主题中的 Template:行是必须的,因为它让WordPress知道子主题的父主题是什么。

下面是一个style.css文件的头部信息的示例:

逐行的简单解释:

  • Theme Name. (必需) 子主题的名称
  • Theme URI. (可选) 子主题的主页。
  • Description. (可选) 子主题的描述。比如:我的第一个子主题,真棒!
  • Author URI. (可选) 作者主页。
  • Author. (optional) 作者的名字。
  • Template. (必需) 父主题的目录名,区别大小写。 注意: 当你更改子主题名字时,要先换成别的主题。
  • Version. (可选) 子主题的版本。比如:0.1,1.0,等。

*/这个关闭标记的后面部分,就会按照一个常规的样式表文件一样生效,你可以把你想对WordPress应用的样式规则都写在它的后面。

要注意的是,子主题的样式表会替换父主题的样式表而生效。(事实上WordPress根本就不会载入父主题的样式表。)所以,如果你想简单地改变父主题中的一些样式和结构——而不是从头开始制作新主题——你必须明确的导入父主题的样式表,然后对它进行修改。

下面的例子告诉你如何使用 @import规则完成这个。

一个子主题的范例

这个例子中的父主题是Twenty Ten,我们喜欢这个主题的几乎每个部分,除了网站标题的颜色,因为我想把它从黑色的改成绿色的。使用子主题的话,只用完成以下三个简单的步骤:

  1. wp-content/themes目录下创建一个新目录,并将它命名为twentyten-child(或其他你喜欢的名称)。
  2. 将下面的代码保存在名为style.css的文件里,并将它放到新建的这个文件夹。
  3. 到WordPress的控制台>主题,然后激活你的新主题:Twenty Ten Child。

下面一步步解释上面代码的作用:

  1. /* 开启子主题的头部信息。
  2. Theme Name: 子主题名称的声明。
  3. Description: 主题的描述(可选,也可被省略)。
  4. Author: 作者名字的声明(可选,也可被省略)。
  5. Template: 声明子主题的父主题,换言之,父主题所在的文件夹的名称,区分大小写。
  6. */子主题头部信息的关闭标记。
  7. @import规则将父主题的样式表调入
  8. #site-title a 定义网站标题的颜色(绿色),覆盖父主题中相同的样式规则。

注意 @import 规则

需要注意的是, @import 规则之前没有其他的CSS样式规则,如果你将其他的规则置于它之上,那么它将无效,并且父主题的样式表不会被导入。

使用 functions.php

不像style.css,子主题中的functions.php不会覆盖父主题中对应功能,而是将新的功能加入到父主题的functions.php中。(其实它会在父主题文件加载之前先载入。)

这样,子主题的functions.php提供了一个灵活稳定的方式来修改父主题的功能。如果你想在你的主题里加入一些PHP函数,最快的方式可能是打开functions.php文件然后加入进去。但那样并不灵活:下次你的主题升级更新了,你加入的新功能就会丢失掉。相反地,如果你使用子主题,将functions.php文件放进去,再将你想加入的功能写进这个文件里,那么这个功能同样会工作得很好,并且对于父主题以后的升级更新,子主题中加入的功能也不会受到影响。

functions.php文件的结构非常简单:将PHP起始标签置于顶部,关闭标签置于底部,它们之间就写上你自己的PHP函数。你可以写得很多,也可以写得很少,反正按你所需。下面的示例是一个基本的functions.php文件的写法,作用是将favicon链接加入到HTML页面的head元素里面。

给主题作者的提示。事实上子主题的functions.php首先加载意味着你的主题的用户功能可插入——即子主题是可替换的——通过有条件地进行声明。例如:

用这种方式,子主题可以替换父主题中的一个PHP函数,只需要简单地对它再次声明。

模板文件

模板文件 在子主题中的表现和style.css一样,它们会覆盖父主题中的相同文件。子主题可以覆盖任何父主题模板中的文件,只需要创建同名文件就行。(注意:index.php在WordPress3.0及以上版本才能被覆盖。)

同样,这项WordPress的功能允许你修改父主题的样式功能而不用去编辑父主题的文件,并且你的修改能让你在更新父主题后继续保留。

下面是一些使用模板文件的子主题的例子:

  • 增加一个父主题没有提供的模板(例如:网站地图页面的模板,或者一单栏页面,它们在页面编辑,模板选择里是可用的)
  • 增加一个比父模板更加具体的模板(见模板级别)。(例如:新加的tag.php模板用于按tag归档的文章来代替父主题中通常的archive.php模板。)
  • 替换父主题中的一个模板.(例:使用你自己的home.php来覆盖父主题中的home.php

其他文件

除 了style.css,functions.php,index.php和home.php,子主题可以使用任何正式主题使用的类型的文件,只要文件被正确链接。打个比方,你可以使用在样式表里或者Javascript文件里链接的图标、图片,或者从functions.php文件中调用出来的额外PHP文件。

引用链接


使用WordPress的子主题功能修改你的WordPress主题

保护wp-login.php后台登陆入口

最近在观察后台的登陆统计的时候,发现来自" 乌克兰"," 美国"的某个IP的访问数量特别多,访问记录显示是大量访问登陆页面 https://www.mobibrw.com/wp-login.php,明显是发生了密码破解攻击。

TopVisitors

login-recorders

本来以为 WordPress 4.4版本已经对密码的访问次数进行了限制,结果试了一下,发现完全没有任何限制,很容易导致密码穷举攻击。比较简单的解决方法是对登陆页面进行密码尝试次数限制。

最方便的是安装 Limit Login Attempts插件即可,这个插件很久不更新了。目前从测试来看,与 WordPress 4.4版本是兼容的。

WordPress 4.4:禁用/关闭XML-RPC

最近网站的访问量统计发现,大量的访问请求来自第三方的国家,远远超过国内的访问量,主要是来自 185.130.5.165这个IP的访问量严重的异常,怀疑是遭到了密码尝试攻击,跟踪日志:

发现如下记录大量重复出现:

由于我并不使用XML-RPC服务,因此考虑禁止对于 xmlrpc.php的访问。

目前由于网站开启了 .htacess的支持,因此,发现在 .htacess中禁止文件访问是最高效的办法。

.htacess的文件尾部增加如下语句即可:

修改后的文件内容变更为:

然后重启 Apache2即可。

然后就会发现访问 http://www.mobibrw.com/xmlrpc.php的时候,直接返回了 403禁止访问了。

参考链接:


wordpress:禁用/关闭XML-RPC
利用xmlrpc.php对WordPress进行暴力破解攻击

WordPress 4.4.2版本在设置固定链接后出现分类翻页异常(404)

为了配合 WP Super Cache,必须对页面进行 固定链接的设置,最初的设置是固定设置成 /p=%post_id%的样子,如下图:
WordpressPermalinkSettingWrong

刚刚开始没发现异常,最近才发现,当一个分类的分页数量大于3页的时候,会出现打不开的情况。

当点击 Android分类的时候,会发现文章分了11页,当点击第二页的时候,发现,链接地址中的" /"被替换成了" %2F",导致网页打不开,直接返回 404,如下图的情况:

ReplaceBy%2F

搜索半天,用Ubuntu12.04下WordPress安装WP Super Cache后链接包含”%2F”导致分类链接返回404的方法总算是解决,本以为没问题了,结果当点击完成第二页,继续点击第三页的时候,继续出现无法访问,观察链接后,发现错的更离谱了。如下图:

ClickTheThirdPage

直接提示" 该页无法显示"

URLInCorrect

仔细观察链接会发现,链接地址莫名的被增加了一段 %2Fpage%2F2,明显是第二页的地址残留,于是手工去掉这个多余的信息,发现是可以正常访问的。

RemovedIncorrectUrl

这就比较扯淡了,说明是页面生成的时候发生了异常。应该是不能正确的处理链接地址中携带 %2F这种转义字符的情况。

网上搜索很长世间,也没有任何的有用信息,结果重新修改了一下 固定链接,修改成 /%year%/%post_id%,结果一切正常了,由此可见,WordPress应该是只测试了一部分情况,只能处理固定格式的 固定链接,随便修改会导致内部代码混乱。WordpressPermalinkSettingCorrect

如此修改后,链接地址中也不会出现" /"被替换成" %2F"的情况了。

Ubuntu12.04下WordPress安装WP Super Cache后链接包含”%2F”导致分类链接返回404

Wordpress安装 WP Super Cache后需要开启" 固定链接",但是开启之后,发现在点击分类链接的时候,一旦出现多页,点击分页的时候返回404错误。
开始认为是重写规则设置得不对, 后来才发现, 是" %2F"导致 Apache直接返回 404错误.

比如浏览查看某个标签下的文章列表的链接为

被重写后的URL变为:

这样" /"被替换为" %2F",当这个请求到达 Apache的时候,被 Apache直接返回 404错误。
Apache有一个配置项"AllowEncodedSlashes", 默认是" Off", 也就是不允许请求路径(上例是 %2Fandroid/page/2)中包含编码后的斜杠' /'(在某些平台是反斜杠' \'). 这个选项的的相应代码在 mod_rewrite模块被执行之前:

默认不允许包含" %2F". 如果请求路径中包含了, 那么 ap_unescape_url()函数认为是无效的路径, 直接返回 HTTP_NOT_FOUND, 最终浏览器得到的是" 404 - Not Found"出错页面.

Apache的配置文件中增加 AllowEncodedSlashes On即可.如下:

参考链接


链接包含"%2F"导致mod_rewrite失效

大批WordPress网站被渗透 ,成为DDOS攻击源

1456369411312.jpg!small

近日,Sucuri的安全研究人员发现,数万WordPress站点被利用于实施第7层DDos攻击。共有两万六千个不同的WordPress站点持续向同一个网站以每秒一万到一万一千次的频率发送HTTPS请求,最多时能达到两万次每秒。更严重是,如果Pingback功能默认开启,全球任何一个WordPress站点都可能被利用,成为DDos攻击网络的一个源头。

HTTP Flood是针对Web服务在第七层协议发起的大规模流量攻击,不仅可以直接导致被攻击的Web前端响应缓慢,还间接攻击到后端的Java等业务层逻辑以及更后端的数据库服务,增大它们的压力,甚至对日志存储服务器都带来影响。

建议所有基于Wordpress的网站尽快禁用Pingback。虽然无法保证网站免于遭受攻击,但会终止黑客利用您的网站来攻击其它目标。

最好的做法是,如果你确定不用pingbacks,就和xmlrpc一并关闭。如果需要使用,可以简单修改.htaccess文件,只允许白名单中的IP来存取文件。流行插件Jetpack也可用于流量监控。

14562244766558.png!small

WordPress的pingback服务可被DDoS攻击利用,这个漏洞早有披露,但至今仍有大量网站存在此问题,原因在于网站所有者很少刻意防止网站被僵尸网络捕获。而由于这种DDoS攻击中流量来自数千个不同IP,基于网络的防火墙也无法识别和拦截,只能限制每个IP地址的访问频率。

1456224508906.png!small

研究人员还发现,大多数实施攻击的源网站托管在知名VPS/云服务提供商:亚马逊的AWS、Digital Ocean、谷歌云、微软的Azure、HETZNER、OVH和Linode。

原文地址:Thousands of WordPress websites used as a platform to launch DDOS

li 的点超出div

在Wordpress写文章的时候,发现列表项的数字总是在 DIV标签的外面,如下所示

  1. 用户界面
  2. 视图导航
  3. 视图设置

HTML的源代码如下:

这种情况是非常不美观的,尤其是当 DIV设置了背景色的时候。

网上查询了一下,发现 list-style-position:inside是用来调整这种情况的。

语法:
list-style-position : outside |inside
取值:
outside :默认值。列表项目标记放置在文本以外,且环绕文本不根据标记对齐
inside :列表项目标记放置在文本以内,且环绕文本根据标记对齐
说明:
设置或检索作为对象的列表项标记如何根据文本排列。
假如一个列表项目的左外补丁( margin-left)被设置为 0 ,则列表项目标记不会被显示。左外补丁( margin-left)最小可以被设置为 30。
仅作用于具有 display属性值等于 list-item的对象。如 li对象。
注意: ol对象和 ul对象的 type属性为其后的所有列表项目(如 li对象)指明列表属性。
此属性对于 currentStyle对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 listStylePosition

 

因此修改上面的代码如下:

修改后的效果如下:

  1. 用户界面
  2. 视图导航
  3. 视图设置