WordPress REST API 定制化输出

WordPress 自4.7 版本后与时俱进推出了REST API,如此一来想象空间又扩展了许多,如今WordPress 可以完全作为后端数据驱动了。本文通过几个例子展示如何定制化输出WordPress REST API 的相关数据。

文章数据(posts)禁止某些字段显示

默认的,当请求类似 your-site.com/wp-json/wp/v2/posts?per_page=5&page=1 的接口来获取文章列表,展示的不少字段对一般人来说是没有必要。

秉承“如无必要,勿增实体”的原则,减少请求时候的数据量,可以通过下面的代码移除:

function dw_rest_prepare_post( $data, $post, $request ) {
	$_data = $data->data;
	$params = $request->get_params();
	// if ( ! isset( $params['id'] ) ) {
		unset( $_data['excerpt'] );
		unset( $_data['author'] );
		unset( $_data['featured_media'] );
		unset( $_data['format'] );
		unset( $_data['ping_status'] );
		unset( $_data['comment_status'] );
		unset( $_data['sticky'] );
		unset( $_data['template'] );
	// }
	$data->data = $_data;
	return $data;
}
add_filter( 'rest_prepare_post', 'dw_rest_prepare_post', 10, 3 );

文章数据(posts)中输出 post meta 所有字段

可能考虑到数据隐私,文章数据(posts)默认并不显示post meta的相关字段,如果你需要输出对应文章下所有 post meta 字段,可以用下面的代码启用:

register_rest_field( 'post', 'metadata', array(
 	'get_callback' => function ( $data ) {
 		return get_post_meta( $data['id'], '', '' );
 }, ));

输出 post meta 特定字段

接上,如果你在REST API 中仅仅想输出 post meta 特定字段而非全部,则通过类似下面代码:

function dw_rest_prepare_post( $data, $post, $request ) {
	$_data = $data->data;
	$params = $request->get_params();
	$thumb =  get_post_meta( $post->ID, 'thumb' );
		if($thumb){
			$_data['thumb_image'] = $thumb;
		}	
	$data->data = $_data;
	return $data;
}
add_filter( 'rest_prepare_post', 'dw_rest_prepare_post', 10, 3 );

上面的代码展示的是如何输出thumb 这个 post meta 字段,请按需使用。

借助 Nginx 控制 /wp-json 的访问

这个倒与WordPress 本身无关了,your-site.com/wp-json 的路由默认是所有人皆可访问。如果你基于服务器负载,或安全等方面考虑选择性输出,可以借助 Nginx 控制访问。先看下面的例子:

location /wp-json {
      if ($http_user_agent !~ '(iPhone|Android)'){
        return 403;
       }
        try_files $uri $uri/ /index.php?$args;
}

如果你熟悉Nginx 语法,就知道上面的代码实现了:除了iOS 跟Android 设备(通过判断请求头的UA 信息),其它访问 /wp-json 的路径均返回403 状态码。这在一定程度上起到了保护作用。


原文链接:来自 DeveWork | https://devework.com/wordpress-rest-api-dynamic-output.html

via Jeff的阳台 https://devework.com/wordpress-rest-api-dynamic-output.html

WordPress WP_Image_Editor_Imagick 指令注入 ImageMagick漏洞

ImageMagick于2016年5月4日突然曝出 CVE-2016-3714漏洞,简单的说就是黑客利用这个漏洞在你的网站上传图片即可给你植入木马,继而达到完全操控你的服务器的目的。 ImageMagick是一个使用非常广的组件,大量厂商都在处理图片的时候调用这个程序进行处理,而且很多开源应用也在核心代码中包含了ImageMagick选项。WordPress是著名的个人博客/CMS厂商,其核心源码中使用了PHP扩展ImageMagick。受到这个漏洞的影响,在攻击者拥有一定权限的情况下,可以在Wordpress中触发任意命令执行漏洞。

解决方案:

官方方案:通过配置策略文件暂时禁用ImageMagick,

可在 “/etc/ImageMagick/policy.xml” 文件中添加如下代码: [crayon-5731823321052191436154/] 当然去官网下载最新版的ImageMagick也是一个坚决方案,官方最新版地址:https://www.imagemagick.org/script/binary-releases.php 最新版本:ImageMagick-7.0.1-2

WordPress漏洞修复-未验证是否真正解决了问题

在wordpress/wp-includes/media.php的_wp_image_editor_choose函数内部找到: [crayon-5731823321064537302611/] 修改为下面这行:(即调换最后数组的顺序) [crayon-573182332106b691782417/] 经过修改后,在阿里云VPS验证已经找不到该漏洞了,状态为漏洞文件被修改。ITGeeker总感觉这类似一个欺骗手法,但不管怎样,云服务器不会提醒你还有漏洞未修复了。

吐槽

国外的安全专家为此漏洞,新开了网站https://imagetragick.com,而且持续更新内容当中,大家也可以在上面找到一些相关的解决方案。 而相比国内的某云来说,他们会通过手机短信或者邮件通知你找到了高危漏洞,而且告诉你可以“一键修复”,让你点击去修复,然后就会告诉你,你还没付钱,不能给你修,真是有点趁火打劫啊! 如果你公布一下修复方法,对于没有技术能力的,可以付费修复也还好啊,这根本太赤裸了。

phpPgAdmin连接postgresql数据库的配置 CentOS6_64bit

phpPgAdmin是Postgresql的图形化操作界面,但是很多ITGeeker往往在安装的时候很难一次性成功,根据多次实践,技术奇客在此与大家分享实战经验,此案例以postgresql9.3版本为例。

 

确认一下是否已安装Postgresql数据库并启动:

netstat -lnp|grep 5432

1. 安装图形客户端phppgadmin

yum install phpPgAdmin

如果没有,安装一下EPEL源吧

yum install epel-release

 

2. phpPgAdmin.conf配置

vi /etc/httpd/conf.d/phpPgAdmin.conf

Alias /phpPgAdmin /usr/share/phpPgAdmin

<Location /phpPgAdmin>
    Order allow,deny
#   Deny from all
    Allow from all
#   Allow from 127.0.0.1
    Allow from ::1
# Allow from .example.com
</Location>

把Allow from改为客户端的ip地址或者本地127.0.0.1(安全性更好),或者改为Allow from all也可。

3. pg_hba.conf配置

vi /var/lib/pgsql/9.3/data/pg_hba.conf
主要修改ipv4部分内容,都改成trust,这样最省事。

# IPv4 local connections:
host all all 127.0.0.1/32        trust
host all all your IP/24          trust
host all all your company IP/24  trust

可以只添加公司的公网ip和自己家里的ip地址,这样比较安全。

修改认证方式,将md5改为trust,然后保存

4. postgresql.conf配置

vi /var/lib/pgsql/9.3/data/postgresql.conf

listen_addresses = '*'

此处主要修改监听本地为监听所有ip,方便远程登入用。

5. phpPgAdmin.conf配置

vi \etc\httpd\conf.d\phpPgAdmin.conf

Alias /phpPgAdmin /usr/share/phpPgAdmin

Order allow,deny
# Deny from all
Allow from all
# Allow from 127.0.0.1
Allow from ::1
# Allow from .example.com

这里一定要配置好allow from all,不要让deny在前面,否则无法登入。

6. phpPgAdmin的config.inc.php配置

\usr\share\phpPgAdmin\conf\config.inc.php
第18行改为

$conf['servers'][0]['host'] = 'localhost';

修改未localhost本地还是其它ip就看你要从哪里登入了。

7. 现在准备登入phpPgAdmin了

service httpd restart

重启web apache服务

service postgresql-9.3 restart

重启postgresql服务,使刚才做的修改生效。
访问 http://your ip address/phpPgAdmin/

注意区分phpPgAdmin的大小写

在Postgresql的web管理界面,输入登陆名及密码 -安装数据库时创建的用户和密码

 

8. 相关问题及碰到困难

 

1. 重置PostgreSQL密码:

 

 

sudo - postgres

psql

#ALTER USER postgres with password '你的密码';
\q

exit
或者有时需要重置postgres用户的linux密码:
sudo passwd -d postgres 删除linux postgres的密码
sudo -u postgres passwd 创建linux postgres的密码

 

 

2. 如果碰到403 forbidden,请检查文件夹权限。

3. 浏览器提示“您的 PHP 中没有完整的数据库支持”

这表明没有安装php和php-pgsql软件包

yum install php-pgsql

yum会同时安装2个依赖包php-pdo,php-common,它们的安装顺序为php-common php-pdo php-pgsql,也可以手动依次安装。

4. 网站打开后直接显示源码

这表明没有安装php

yum install php

5. 如果碰到版本冲突

Error: Package: php-pgsql-5.3.3-40.el6_6.x86_64 (updates)
           Requires: php-common(x86-64) = 5.3.3-40.el6_6
           Installed: php-common-5.4.33-2.el6.remi.x86_64 (@remi)
               php-common(x86-64) = 5.4.33-2.el6.remi
           Available: php-common-5.3.3-38.el6.x86_64 (base)
               php-common(x86-64) = 5.3.3-38.el6
           Available: php-common-5.3.3-40.el6_6.x86_64 (updates)
               php-common(x86-64) = 5.3.3-40.el6_6
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

解决方案

rpm -qa | grep php-common 
rpm -e --nodeps php-common-5.4.33-2.el6.remi.x86_64

使用强制移出冲突版本需注意其它软件和它依赖的关系,否则会引起其它软件无法运行等问题。

 

CentOS 7 64bit如何安装php soap模块

错误提示:
Your server does not have the SOAP Client class enabled – some gateway plugins which use SOAP may not work as expected.
查看soap模块是否安装的办法:在php的安装目录下运行php -m来查看
/usr/bin/php -m |grep 'sosap'

如果没有安装,则进入php的安装源文件夹

cd /tmp && tar zxvf php-5.4.16.tar.gz && cd php-5.4.16/ext/soap

此处自己去php官方下载相应的版本。

进入后运行phpize命令
/usr/bin/phpize

碰到错误提示,安装两个依赖包解决

# /usr/bin/phpize
Can’t find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
yum install php-pear
yum install php-devel

查看信息是否有还有错误,没有出错的话运行如下命令:

./configure –-with-php-config=/usr/local/php/bin/php-config –enable-soap
./configure --with-php-config=/usr/bin/php-config --enable-soap

然后是安装编译

make
最后是安装
make install
安装好之后会提示soap.so文件的保存路径
# make install
Installing shared extensions:     /usr/lib64/php/modules/
接着修改php.ini文件
vi /etc/php.ini
查找/etc/php.ini中的extension_dir = “./”,默认是注释掉的
修改为

extension_dir = "/usr/lib64/php/modules/"

并在此行后增加如下,然后保存:

extension = "soap.so"

执行php-fpm看看有没有错误

没有php-fpm,安装一个吧
yum install -y php-fpm
重新启动apache:
systemctl restart php-fpm
再运行php -m就已经能看到扩展的soap模块了。

CentOS 7 64bit Minimal安装后的初步10项优化和配置(更新epel和remi源安装)

CentOS官方于2014年7月7日发布64位CentOS 7.0.1406开始,不知不觉已快半年了。也已经有越来越多的软件开始支持CentOS7了。ITGeeker也尝试将越来越多的服务架构于其之上。

CentOS 7是一个大版本更新,应该有不少提升。连服务的启动停止命令也有了很大的变化。

CentOS 6及之前:

service httpd restart

CentOS 7:

systemctl start httpd.service

centos7

1. 更新系统并安装必备的组件

yum upgrade or yum update
yum install wget telnet perl perl-devel net-tools kernel-devel 
yum groupinstall "Development tools" -y

安装这些之后会大大方便今后安装其他应用是碰到的依赖包问题。其中net-tools是为了提供dig, nslookup, ipconfig等命令,方便配置CentOS 7初始化网络环境。如果不安装这个,在CentOS 7中,可以使用ip addr命令来代替ipconfig进行当前ip地址查询。

2. 添加源(repository)REMI & EPEL

yum安装时,要想安装比较新的版本软件,可以试试这两个源。都有一些国内镜像,我添加的EPEL是阿里云镜像的。

这是适合CentOS 6的源

cd /tmp && wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && wget http://mirrors.yun-idc.com/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm -Uvh remi-release-6.rpm epel-release-6-8.noarch.rpm

真正适合CentOS 7的epel和remi源

rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

如果国外没法用,那用国内的镜像源

#中科大镜像源
rpm -Uvh http://mirrors.ustc.edu.cn/centos/7.0.1406/extras/x86_64/Packages/epel-release-7-5.noarch.rpm

#浙大源
rpm -Uvh http://mirrors.zju.edu.cn/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

#上海交大源
rpm -Uvh http://ftp.sjtu.edu.cn/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

#sohu镜像源,更新比较慢 
rpm -Uvh http://mirrors.sohu.com/fedora-epel/7/x86_64/e/epel-release-7-2.noarch.rpm

使用方法:

yum --enablerepo=remi install php mysql php-mysql mysql-server phpmyadmin 

或者

yum --enablerepo=epel install php mysql php-mysql mysql-server phpmyadmin

3. FQDN配置,全称Fully Qualified Domain Name

有些软件,特别是邮件系统对这个要求比较高。

vi /etc/hosts

127.0.0.1 localhost.localdomain localhost geeker
::1 localhost.localdomain localhost geeker

vi /etc/sysconfig/network
HOSTNAME=geeker

设置好之后,查询是否完整

hostname -f

4. 关闭Selinux

这是Centos系统的安装机制,单单往往导致很多软件无法正常安装,让我们关掉它吧!

/etc/selinux/config
在 SELINUX=enforcing 前面加个#号注释掉它
#SELINUX=enforcing
然后新加一行
SELINUX=disabled
#SELINUXTYPE=targeted #注释掉这行

保存,退出,重启系统,搞定。

不想重启,可以使用

setenforce 0 #使配置立即生效

5. CentOS 7的防火墙关闭和iptables安装

CentOS 7.0默认使用的是firewall作为防火墙,但可能一下子很难适应,让我们先改回原先的iptables防火墙吧!

关闭CentOS 7的firewall:

systemctl stop firewalld.servic #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

安装iptables防火墙

yum install iptables-services #安装
vi /etc/sysconfig/iptables #编辑防火墙配置文件

启动iptables防火墙

systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动

6. 本地SMTP邮件发送功能(Postfix)

很多软件和服务可以用到这个功能给用户发送通知邮件,需要配置一下。

最好加上一个认证,使用Postfix + Saslauthd

yum remove sendmail   #如果有原先的sendmail,先移除
yum install postfix   
vi /etc/postfix/main.cf   #编辑postfix主配置文件
useradd itgeeker   #增加用户
passwd itgeeker   #设置用户密码
yum install cyrus-sasl*

/bin/systemctl restart saslauthd.service && /bin/systemctl restart postfix.service   #启动postfix和saslauth服务

最好用telnet测试一下,前面安装的telnet就发挥作用了。

telnet localhost smtp
ehlo localhost
mail from:
rcpt to:<alanljj@qq.com>
data
Welcome to itgeeker mail server
.
quit
#查看邮件内容
less /var/log/maillog
cd /root/Maildir/new #注意M要大写
ll
cat ***** #*代表列出的文件名,可以查看新的邮件内容
vi /var/log/maillog
Tips小技巧:
有时候telnet登陆后就退不出来了ctrl+c也不管用此时可以使用ctl+] 切换,然后quit退出。

7.  CentOS 7时间同步及更改

和之前基本一样:

date

yum install ntpdate -y
ntpdate time.windows.com && hwclock -w

#连网更新时间,如果成功,将系统时间,写入BOIS

hwclock -w 或 hwclock --systohc

date -s 20150119
date -s 17:28:00

8. Shell登陆操作显示中文乱码问题(和CentOS 6一样,问题还是存在)

方法一:

vi /etc/sysconfig/i18n 文件中修改LANG的设置为:
#LANG="en_US.UTF-8"
#SYSFONT="latarcyrheb-sun16"
LANG="zh_CN.GBK"
LANGUAGE="zh_CN.GBK:zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="lat0-sun16"

然后在/etc/profile文件中增加export LC_ALL=zh_CN.GBK内容。使得全部的LC*都统一了。

重启主机

方法二: 更改shell的显示语言

ITGeeker技术奇客使用的是xshell,直接在当前链接的属性-终端-选择UTF-8为编码即可。如果你经常使用变换使用shell,那就用第一种方法吧。

9. FTP服务安装(vsftpd安装)

 

为主机开通FTP服务还是非常有必要的,我们为主机快速安装vsftpd吧。

可以参考详细教程 CentOS6.5 64bit如何安装配置FTP服务(vsftpd)

yum install vsftpd -y
vi /etc/vsftpd/vsftpd.conf

#记得CentOS 7启动命令有所不同

systemctl restart vsftpd
systemctl enable vsftpd

10.  Vmware Tools安装

如果你使用的是虚拟机,那最好装一下Vmware Tools

 

先点击Vmwar虚拟机管理界面菜单,虚拟机–安装Vmware Tools安装。

mkdir /mnt/cdrom && mount -t iso9660 /dev/cdrom /mnt/cdrom && cd /mnt/cdrom && cp VMwareTools-9.6.2-1688356.tar.gz /root

mount -t iso9660 /dev/cdrom /mnt/cdrom && cd /mnt/cdrom && cp VMwareTools-9.6.2-1688356.tar.gz /root

cd /root && tar zxvf VMwareTools-9.6.2-1688356.tar.gz && cd vmware-tools-distrib

安装vmware tools
./vmware-install.pl

中间的问题全部选择默认,可能会有错误提示,基本没啥问题。

依赖包,如果有需要 yum -y install perl perl-devel

请使用你的版本代替VMwareTools-9.6.2-1688356.tar.gz

CentOS6.5 64bit如何关闭Selinux

SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。

selinux

但是SElinux是php的天敌,经常由于CentOS系统默认系统的安全性配置导致些莫名其妙的问题,比如SElinux本来是用于安全子系统的权限控制,可是搞不好就发现限制多多。所以很多软件安装之前要求关闭SElinux.

如何查看SELinux状态?

1. SELinux status参数为enabled即为开启状态

/usr/sbin/sestatus -v
SELinux status: enabled

2、getenforce命令检查

如何关闭SElinux

1. 临时快速关闭SElinux,不用重启机器

/usr/sbin/setenforce 0 立刻关闭 SELINUX
/usr/sbin/setenforce 1 立刻启用 SELINUX

2. 在启动时加载Selinux禁用命令行

echo "/usr/sbin/setenforce 0" >> /etc/rc.local

3. 编辑配置文件达到一劳永逸,当然会对安全有所影响

vi /etc/selinux/config

#SELINUX=enforcing #注释此行
#SELINUXTYPE=targeted #注释此行

SELINUX=disabled #增加此行

:wq 保存并关闭

shutdown -r now #重启系统

 

如何安装开源网站分析工具Piwik Centos 6 64-bit

因为悲催的Google Analytics在国内越来越不好用,添加谷歌分析的代码会严重拖慢网站的打开速度。国内有没有什么好的网站流量分析工具,国外的开源网站分析工具Piwik是个不错的选择,而且原生支持中文。

piwik_app

Piwik最大的特点便是容许用户将这款网站分析工具安装在自己的服务器上,使用者独立拥有自己的统计数据,而不是寄存在服务商那里,这样就可以更灵活的使用统计数据,不用担心数据丢失问题, 数据安全,反应速度都比谷歌分析好。

Piwik的官方Demo:http://demo.piwik.org

安装完成之后会有一段Js代码,将这段代码贴至Body标签之前就可实现对相应页面的跟踪。

Piwik在Centos上的安装方法:

第一步,首先要确定安装好PHP环境和MYSQL数据库。

CENTOS6 64-BIT如何安装PHP

第二步,下载piwik安装包

cd /tmp
wget http://builds.piwik.org/piwik.zip

第三步,解压缩piwik到你的apache或其它网站服务的目录

unzip -o piwik.zip /www/html

第四步,设置好httpd的网站绑定和设置

vi /etc/httpd/conf/httpd.conf

第五部,打开piwik的网址,进入配置向导

http://server-ip-address/

 可能需要解决的问题:

  • 安装pdo_mysql包

Piwik是一套基于Php+MySQL技术建的开源网站访问统计系统,前身是phpMyVisites。Piwik可以给你详细的统计信息,比 如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等,并且采用了大量的AJAX/Flash技术,使得在操作上更加便易。

Piwik还采用了插件扩展及开放API架构,可以让开发人员根据 自已的实际需求创建更多的功能.Pwiki容许用户将这款网站分析工具安装在自己的服务器上,而不用寄存在别的服务商,这就是Piwik自称为实时网站分析工具的原因,不用像谷歌分析至少需要几个小时才能更新数据。

Centos6 64-bit如何安装PHP

作为LANMP组件的重要组成部分,学会快速安装和测试PHP显得非常重要。

php

PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收了C语言、Java和Perl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面,但PHP也被用于其他很多领域。

Centos Shell底下安装和测试PHP

# yum install php -y

安装非常简单,但要是想安装比较新的稳定版本PHP 5.4.30,可能需要更改CentOS源Repository进行安装,ITGeeker建议你参考:

 在 CENTOS 6 上安装 PHP 5.4.30

据说新版本的PHP比原先的版本速度高出将近一倍。

测试PHP是否安装正确

1. 建立测试文件 “testphp.php”,放在Apache网站服务的根目录

# vi /var/www/html/testphp.php

2. 添加以下内容:

<?php
phpinfo();
?>

3. 重启httpd服务

# service httpd restart

4. 打开页面

http://server-ip-address/testphp.php

testphp

这里会显示关于PHP版本等所有的详细信息。

如果你想让你的Mysql支持你的php,只要安装php-mysql就可以了

# yum install php-mysql -y

如果现在打开testphp.php文件就会看到mysql module的所有信息。

在 CentOS 6 上安装 PHP 5.4.30

安装的命令行很简单

sudo yum --enablerepo=remi install php

php

不过如果你没有配置源Repository,就需要首先启动REMI源:

cd /tmp
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

wget http://mirrors.sohu.com/fedora-epel/6/i386/epel-release-6-8.noarch.rpm

rpm安装

rpm -Uvh remi-release-6.rpm epel-release-6-8.noarch.rpm

然后用remi源来安装php

yum --enablerepo=remi install php

确认正确的版本,回答Y开始安装。

如何查看PHP的版本号:

# php -v
PHP 5.4.30 (cli) (built: Jun 25 2014 15:27:51) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
with Zend Guard Loader v3.3, Copyright (c) 1998-2013, by Zend Technologies

安装成功。