如何在Ubutu系统(VPS)安装WordPress

WordPress是一个免费的开源博客软件和CMS(内容管理系统)。在10万个网站中就有超过22.0%用WordPress程序构建,它是世界上最流行的博客平台之一。关于WordPress的最好的事情是,WordPress拥有成千上万个各式WordPress插件和不计其数的WordPress主题模板样式。任何人都可以在不懂编程和服务器知识的情况下创建功能非常好的网站。
在这篇文章中,将会指导你如何在Ubutu的VPS下一步一步安装WordPress。

安装条件

在我开始之前,当然你要有一个自己的VPS服务器。现在的各种云都比较流行,大家可以自己去考量。我个人用的阿里云的VPS,价格稍贵,稳定性还行。最近貌似在搞活动,大家可以自己去看。如果你是单个小网站,建议去买个虚拟主机就行了,建一个小的WordPress博客应该是绰绰有余的。后续的流量增加,你可以自己去调整服务器。
WordPress是基于PHP和Mysql库来存储所有信息的。所以,你需要安装一些配置环境,像军哥的LNMP一键安装包,或者是一些集成面板像wdcp,如果你不喜欢这些,可以去看看我之前发的:VPS管理面板推荐:18款开源/商业 Linux 服务器控制面板。里面有许多国外优秀的主机面板。
如果环境以及配置好了,你可以使用任何SSH客户端登录你的VPS服务器,然后安装下面操作。

1. 为WordPress创建一个MySQL数据库和用户

正如上面我所说的WordPress需要数据库来存储所有的信息,我们已经安装了MySQL数据库。现在,我们来为WordPress程序创建一个数据库和用户。
通过以下命令来得到MySQL使用root访问权限

mysql -u root -p

输入你的root密码后,你会获得的MySQL提示符运行命令。现在,可以创建WordPress博客的数据库了,我会给这个数据库命名:wordpressdemo。你可以给自定义设置你的数据库名称。现在,输入以下命令:

CREATE DATABASE wordpressdemo;

现在,我们要创建一个WordPress数据库的新用户。为了数据安全方面的考虑,单独创建一个数据库用户是不错的做法。
创建MySQL用户之后要授予相关数据的所有特权:

GRANT ALL ON wordpressdemo.* TO demouser@localhost IDENTIFIED BY 'qwerty';

上面的命令将创建一个是密码是”qwerty”的数据库用户demouser,并且这个用户拥有数据库wordpressdemo的所有权限。mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问。所以运行下面的命令:

FLUSH PRIVILEGES;

最后关闭MySQL的命令提示符:

exit

2. 下载WordPress的安装包

在接下来的步骤中,我们将下载的WordPress程序的最新版本。首先更改目录到你网站所在的文件目录。在Apache中通常是htdocs目录的public_html,现在,我已经创建的public_html,所以更改目录

将目录更改为WordPress的文件位置:

cd /var/www/domain.com/public_html/

下面通过wget命令来下载WordPress安装包:

wget http://cn.wordpress.org/wordpress-3.9-zh_CN.tar.gz

输入解压缩命令来把安装包解压到当前目录:

tar--strip-components=1-xvf wordpress-3.9-zh_CN.tar.gz

解压完成后,可以删除WordPress程序安装包:

rm wordpress-3.9-zh_CN.tar.gz

3. 在Web界面下安装WordPress

下一步将配置WordPress的MySQL数据库和用户名。有两种方式可以解决:
一种是手动编辑wp-config.php文件和其他人正在使用的wordpress web界面。
第二个选项是很容易的,我会解释的那一个。
打开浏览器,输入博客网址,它会打开WordPress的安装向导,并要求你创建一个配置文件,只需按一下按钮,然后它会要求你填写MySQL数据库名,用户名,密码,数据库主机和表前缀。
wordpress-local
输入数据库名,用户名和密码之后。对于数据库主机和表前缀,你可以保持默认值(如果你有多个WordPress网站,建议更改数据库前缀)。如果你的数据库服务器在不同的主机上,那么你需要输入数据库主机详细信息。点击提交下一个步骤。如果您收到错误消息,该向导无法写入wp-config.php文件。其原因是WordPress没有写入权限,则可以通过在终端输入以下命令解决这个错误
新增WWW的数据写入权限

sudo chown -R www-data:www-data /var/www/domain.com/public_html

更改后,点击重新运行安装按钮和WordPress的后会要求你输入网站标题,管理员用户名,密码和电子邮件id,输入后就可以继续安装直至完成。
U2MRRMY
最后提示你已经安装成功,如上图。
现在我们已经完成了在Ubuntu VPS WordPress程序的安装。这是个很简单的教程。如果你觉得有用,可以分享一下。

wordpress新用户注册添加验证问题

最近越来越多使用wordpress建站的童鞋给网站加上了用户中心功能,并且开放了网站注册,但是随之而来的就是大量的机器注册的垃圾用户,有些童鞋非常机智的利用插件给注册表单加上了验证码,有些童鞋则想给注册表单添加一个验证问答,其实也推荐大家使用验证问答,这样对于某些限制注册的网站非常适用,某些网站可能仅仅只开放给部分人群,则可以仅仅将答案告诉那部分人群即可,这样的效果验证码显然不能实现。先上一张效果图:
ff151f3ad5209e5f

将下面的代码添加到主题的 functions.php 即可:


add_action( 'register_form', 'add_security_question' );
function add_security_question() { ?>
    <p>
    <label><?php _e('请输入本站完整域名:'www.floryu.com') ?><br />
        <input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" /></label>
    </p>
add( 'proofempty', '错误: 您还没有回答问题。'  );
    // 如果答案不正确
    } elseif ( strtolower( $_POST[ 'user_proof' ] ) != 'www.floryu.com' ) {
        return $errors->add( 'prooffail', '错误: 您的回答不正确。'  );
    }
}

另外还可以添加多个随机问题,代码如下:


function rand_reg_question(){
    $register_number=rand(0,1); // 设置随机数的返回范围
    $_SESSION['register_number']=$register_number;
}
add_action('login_head','rand_reg_question');
    
global $register_questions;
global $register_answers;
// 添加问题数组
$register_questions=array('秦始皇是哪个朝代的君主?','共产党的理论基础是什么?');
// 添加答案数组(与上面的问题对应)
$register_answers=array('秦代','马列主义');
    
add_action( 'register_form', 'add_security_question' );
function add_security_question() {
    global $register_questions;
    $register_number=$_SESSION['register_number'];
    ?>
   <p>
        <label><?php echo $register_questions[$register_number];?><br />
            <input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" />
        </label>
    </p>
add( 'proofempty', '错误: 您还没有回答问题。' );
    } elseif ( strtolower( $_POST[ 'user_proof' ] ) != $register_answers[$register_number] ) {
        return $errors->add( 'prooffail', '错误: 您的回答不正确。' );
    }
}

注:请编辑 14 和 16 行修改问题和答案,如果你修改了问题的数量,请记得修改第 6 行的 随机数返回范围 rand(0,1) ,比如 3 个问题,修改为 rand(0,2)。

wordpress设置固定链接后,去掉Category的解决办法

为了SEO我们常常需要对wordpress做一定优化,今天先给大家分享一个,去掉category的方法,降低目录的深度。WordPress去掉固定链接里的“category”的办法很多,这里介绍四个简单易用的,起个抛砖引玉的作用。一是在Wordpress后台固定链接里设置;二是通过修改Wordpress核心函数实现;三是通过Wordpress插件实现;四是通过纯代码实现。大家选择性的使用吧…….

1.修改固定链接设置

登录你的Wordpress后台,打开固定链接/永久链接设置项。在“可选设置”里的“分类地址前缀”里输入半角字符: “.”;保存即可去掉分类前缀category。

优点:设置简单,老少皆宜。适用于初建成的博客,或刚打算使用固定链接 /永久链接的博客。用不着修改代码,升级之时没有顾虑;用不着插件,不会增加运行负担。

缺点:原链接无法打开,出现404错误。被搜索引擎收录良好,或分类链接有较多外链链入的博客,可要万分小心了。不要因为操作简单、省时省力而损失了大量外链及权重。开启重写后,这样设置会导致分类和标签下找不到对应文章,所以最好还是只将其缩短。

评论:不好用,category是去掉了,404又来了,不建议使用

2.修改Wordpress函数

对于 wordpress 中的各类问题,几乎都能找到插件解决,这个问题也不例外。但是很大一部分码农患有严重的代码控,但凡修改代码可以达到的效果绝不用插件代替,即便后者更为简单。所以在这里介绍一个非插件的方法:

WordPress3.2之前版本

在目录 wp-includes/category-template.php 文件中搜索:

$catlink = $wp_rewrite->get_category_permastruct();

在下面添加:

$catlink = str_replace('/category', "", $catlink);

保存即可。

WordPress3.2版本

在目录 wp-includes/category-template.php 文件中搜索:
function get_category_link( $category )
在最后的

return $category;

之前加入

$category = str_replace('/category', "", $category);

优点:仅加入一段代码,性能影响忽略不计。适用于对代码稍熟悉的博客。
缺点:修改代码,博客升级还要修改。且原地址仍可以访问。或会造成谷歌网站管理员工具里提到的,重复的标题。

3.借助Wordpress插件

1、WP No Category Base:作者iDope,是为去除固定链接中分类链接里的category而开发出来的一款wordpress插件,被下载近5万次。安装启用此插件后,对原来的分类地址做了301跳转,对SEO优化有好处,把降权风险降到最低。    点击下载

2、No category parents:作者milardovich,上面插件的升级版,不仅能去掉分类链接的前缀category,还能去掉父分类 parent-category。例如能把“/category/parent-category/my-category/”换成“/my-category/”形式。    点击下载

优点:安装简单,老少皆宜。无论是初建成的博客,还是正打算使用固定链接 /永久链接的博客,还是被搜索引擎收录良好的博客。用不着修改代码,升级之时没有顾虑。使用301跳转,把原链接进行跳转。最大程度防止搜索引擎降权,防止原链接打不开。

不足:插件或许会造成空间负担。这里不说是缺点,就是因为,造成的“空间负担”微乎其微,不应该是缺点。比较在意的就不用,无所谓推荐使用。

3.纯代码去除Category

做为一个不爱好插件的人员,当然要使用代码来解决了,其实也很简单的!
首先移除掉你的去除category插件,然后保存一下当前的固定链接结构,然后再按照下面的来操作,不少人反应没效果,我也是折腾了好久才知道的。
打开你主题的functions.php,然后加入下面这些代码


//去除category分类标志代码
add_action( 'load-themes.php', 'no_category_base_refresh_rules');
add_action('created_category', 'no_category_base_refresh_rules');
add_action('edited_category', 'no_category_base_refresh_rules');
add_action('delete_category', 'no_category_base_refresh_rules');
function no_category_base_refresh_rules() {
 global $wp_rewrite;
$wp_rewrite -> flush_rules();
}
// register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
// function no_category_base_deactivate() {
// remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
// // We don't want to insert our custom rules again
// no_category_base_refresh_rules();
// }

// Remove category base
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
 global $wp_rewrite, $wp_version;
 if (version_compare($wp_version, '3.4', '<')) {
 // For pre-3.4 support
$wp_rewrite -> extra_permastructs['category'][0] = '%category%';
 } else {
$wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';
 }
}

// Add our custom category rewrite rules
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
 //var_dump($category_rewrite); // For Debugging
$category_rewrite = array();
$categories = get_categories(array('hide_empty' => false));
 foreach ($categories as $category) {
$category_nicename = $category -> slug;
 if ($category -> parent == $category -> cat_ID)// recursive recursion
$category -> parent = 0;
elseif ($category -> parent != 0)
$category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;
$category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
$category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
$category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';
 }

 // Redirect support from Old Category Base
 global $wp_rewrite;
$old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
$old_category_base = trim($old_category_base, '/');
$category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
 //var_dump($category_rewrite); // For Debugging
 return $category_rewrite;
}
// Add 'category_redirect' query variable
add_filter('query_vars', 'no_category_base_query_vars');
function no_category_base_query_vars($public_query_vars) {
$public_query_vars[] = 'category_redirect';
 return $public_query_vars;
}

// Redirect if 'category_redirect' is set
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
 //print_r($query_vars); // For Debugging
 if (isset($query_vars['category_redirect'])) {
$catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');
status_header(301);
header("Location: $catlink");
 exit();
 }
 return $query_vars;
}

OK,今天因为自己刚刚操作实践过,就写下来了,希望大家以后有遇到这样的情况可以在这里找到方法解决!

wordpress远程图片文件自动本地化

使用过百度ueditor编辑器插件的小伙伴一定会发现,ueditor编辑器会自动把外链的原创图片抓取到本地,并且使用本地的图片链接来显示在网站上,这个对于很多怕外链图片不稳定又不愿意自己下载上传图片的小伙伴来说简直就是神器~,可是呢不使用ueditor小伙伴就享受不到这个神器般的功能,正好在某老外博客看到一篇远程图片自动本地化的代码,这就立即分享给大家,代码如下:


 //远程图片文件自动本地化
add_filter('content_save_pre', 'auto_save_image');
function auto_save_image($content) {
 $upload_path = '';
 $upload_url_path = get_bloginfo('url');
   
 //上传目录
 if (($var = get_option('upload_path')) !=''){
 $upload_path = $var;
 } else {
 $upload_path = 'wp-content/uploads';
 }
 if(get_option('uploads_use_yearmonth_folders')) {
 $upload_path .= '/'.date("Y",time()).'/'.date("m",time());
 }
   
 //文件地址
 if(($var = get_option('upload_url_path')) != '') {
 $upload_url_path = $var;
 } else {
 $upload_url_path = bloginfo('url');
 }
 if(get_option('uploads_use_yearmonth_folders')) {
 $upload_url_path .= '/'.date("Y",time()).'/'.date("m",time());
 }
   
 require_once ("../wp-includes/class-snoopy.php");
 $snoopy_Auto_Save_Image = new Snoopy;
   
 $img = array();
   
 //以文章的标题作为图片的标题
 if ( !empty( $_REQUEST['post_title'] ) )
 $post_title = wp_specialchars( stripslashes( $_REQUEST['post_title'] ));
 $text = stripslashes($content);
 if (get_magic_quotes_gpc()) $text = stripslashes($text);
 preg_match_all("/ src=(\"|\'){0,}(http:\/\/(.+?))(\"|\'|\s)/is",$text,$img);
 $img = array_unique(dhtmlspecialchars($img[2]));
 foreach ($img as $key => $value){
 set_time_limit(180); //每个图片最长允许下载时间,秒
 if(str_replace(get_bloginfo('url'),"",$value)==$value&&str_replace(get_bloginfo('home'),"",$value)==$value){
 //判断是否是本地图片,如果不是,则保存到服务器
 $fileext = substr(strrchr($value,'.'),1);
 $fileext = strtolower($fileext);
 if($fileext==""||strlen($fileext)>4)
 $fileext = "jpg";
 $savefiletype = array('jpg','gif','png','bmp');
 if (in_array($fileext, $savefiletype)){
 if($snoopy_Auto_Save_Image->fetch($value)){
 $get_file = $snoopy_Auto_Save_Image->results;
 }else{
 echo "error fetching file: ".$snoopy_Auto_Save_Image->error."
"; echo "error url: ".$value; die(); } $filetime = time(); $filepath = "/".$upload_path;//图片保存的路径目录 !is_dir("..".$filepath) ? mkdirs("..".$filepath) : null; //$filename = date("His",$filetime).random(3); $filename = substr($value,strrpos($value,'/'),strrpos($value,'.')-strrpos($value,'/')); //$e = '../'.$filepath.$filename.'.'.$fileext; //if(!is_file($e)) { // copy(htmlspecialchars_decode($value),$e); //} $fp = @fopen("..".$filepath.$filename.".".$fileext,"w"); @fwrite($fp,$get_file); fclose($fp); $wp_filetype = wp_check_filetype( $filename.".".$fileext, false ); $type = $wp_filetype['type']; $post_id = (int)$_POST['temp_ID2']; $title = $post_title; $url = $upload_url_path.$filename.".".$fileext; $file = $_SERVER['DOCUMENT_ROOT'].$filepath.$filename.".".$fileext; //添加数据库记录 $attachment = array( 'post_type' => 'attachment', 'post_mime_type' => $type, 'guid' => $url, 'post_parent' => $post_id, 'post_title' => $title, 'post_content' => '', ); $id = wp_insert_attachment($attachment, $file, $post_parent); $text = str_replace($value,$url,$text); //替换文章里面的图片地址 } } } $content = AddSlashes($text); remove_filter('content_save_pre', 'auto_save_image'); return $content; } function mkdirs($dir) { if(!is_dir($dir)) { mkdirs(dirname($dir)); mkdir($dir); } return ; } function dhtmlspecialchars($string) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = dhtmlspecialchars($val); } }else{ $string = str_replace('&', '&', $string); $string = str_replace('"', '"', $string); $string = str_replace('<', '<', $string); $string = str_replace('>', '>', $string); $string = preg_replace('/&(#\d;)/', '&\1', $string); } return $string; }

将此代码写入主题的functions.php文件或者是functions.php的引入文件中即可,以后每当在wordpress发布文章时如果文章中含有外链图片就会自动本地化了,无需任何设置操作非常方便。

使用wordpress自带smtp发送邮件通知

前面去掉了第三方评论插件多说,使用了wordpress自带评论,发现没有了邮件通知功能,通过排查,发现主机未开启mail()函数,准备开启这个函数,发现网上对wordpress自带的sendmail发送邮件评论不好,就放弃开启了,改为smtp发送,以前折腾时也用过smtp,不过那是是通过插件实现的,今天才知道wordpress也自带了smtp功能,于是就调用,通过下面代码放到主题functions.php文件中,即刻调用wordpress系统自带 smtp功能。


//自动邮件发送
function mail_smtp($phpmailer)
{
$phpmailer->isSMTP();
$phpmailer->SMTPAuth = true; // 开启SMTPAuth服务
$phpmailer->Port = 465; // SMTP邮件发送端口,常用端口有:25,安全链接端口:465
$phpmailer->SMTPSecure = ‘ssl'; // 是否通过SSL链接,如不是此处删掉ssl,如果是不用改
$phpmailer->Host = ‘smtp.****.com'; // SMTP服务器地址
$phpmailer->Username = ‘admin@domain.com'; // 您的邮件地址
$phpmailer->Password = ‘******'; // 你的邮箱登陆密码
}
add_action(‘phpmailer_init’, ‘mail_smtp’);

代码中相关参数自行修改,然后在后台设置里常规设置里把电子邮件地址填写成和这里Username一致的邮箱地址,这样就成功了,尽情的测试吧!

怎么修改WordPress的后台登录地址

今天小编实在想不到更新点什么比较好。就给大家带来一个wordpress的教程吧。这个教程简单来说就是将你后台地址修改掉。小编建议是更改掉。因为两种好处。
1.可以预防一部分人登录你的后台。(虽然他们不知道账号和密码,但是也挺烦人的)
2.可以让一部分不知道你用是什么系统建站(因为所有WP程序建站的网站默认都是网址/wp-admin)对于部分站长来说,这很有必要。
使用方法:把下面的代码,放入当前使用的主题中的functions.php文件当中。


//保护后台登录(www.floryu.com)
add_action('login_enqueue_scripts','login_protection');  
function login_protection(){  
    if($_GET['flor'] != 'yu')header('Location: http://www.floryu.com/404');  
}

把这段代码加入到functions.php后,那么想要登录后台,就只能访问http://www.floryu.com/wp-login.php?flor=yu,你再输入网址/wp-admin 会自动跳转到http://www.floryu.com/404(推荐设置成404页面)具体效果,可以访问本站试试。

代码中的flor和yu还有结尾的那个网址改成自己需要的。本站只做演示。

无插件实现压缩wordpress前台页面html压缩

至于我们为什么要压缩前端,这都是有理由的。

我们来举个例子。假设我现在手上有10斤重的杂物。现在通过压缩后,变得只有78斤重了,我提起来是不是会更加轻松?同理,压缩你的前端也是一样如此。所以我们有必要去压缩,虽然帮助可能不大,但是聊胜于无啊。

现在上代码:(代码加在functions.php当中)


//压缩时绕过代码块
function unCompress($content) {
    if(preg_match_all('/(crayon-|<\/pre>)/i', $content, $matches)) {
        $content = ''.$content;
        $content.= '';
    }
    return $content;
}
add_filter( "the_content", "unCompress");
//压缩html代码 
function wp_compress_html(){
    function wp_compress_html_main ($buffer){
        $initial=strlen($buffer);
        $buffer=explode("", $buffer);
        $count=count ($buffer);
        for ($i = 0; $i <= $count; $i++){
            if (stristr($buffer[$i], '')) {
                $buffer[$i]=(str_replace("", " ", $buffer[$i]));
            } else {
                $buffer[$i]=(str_replace("\t", " ", $buffer[$i]));
                $buffer[$i]=(str_replace("\n\n", "\n", $buffer[$i]));
                $buffer[$i]=(str_replace("\n", "", $buffer[$i]));
                $buffer[$i]=(str_replace("\r", "", $buffer[$i]));
                while (stristr($buffer[$i], '  ')) {
                    $buffer[$i]=(str_replace("  ", " ", $buffer[$i]));
                }
            }
            $buffer_out.=$buffer[$i];
        }
        $final=strlen($buffer_out);   
        $savings=($initial-$final)/$initial*100;   
        $savings=round($savings, 2);   
        $buffer_out.="\n";   
    return $buffer_out;
}
ob_start("wp_compress_html_main");
}
add_action('get_header', 'wp_compress_html');

如何让wordpress支持自定义菜单

WordPress现在已经支持自定义菜单了,这样我们就能自己定义我们的导航栏了,但是最近我发现,如果Wordpress主题不支持自定义菜单功能,那么我们还是无法通过菜单功能把文章分类或页面放到导航上去。通过百度搜索终于找到了答案,分享如下:
这个方法是针对inove主题的,其他主题通过这种方法应该也能解决。
首先,我们了解一下wordpress的wp_nav_menu()函数:

 
<?php wp_nav_menu(
array(
‘theme_location’ => ” //指定显示的导航名,如果没有设置,则显示第一个
‘menu’ => ‘header-menu’,
‘container’ => ‘nav’, //最外层容器标签名
‘container_class’ => ‘primary’, //最外层容器class名
‘container_id’ => ”,//最外层容器id值
‘menu_class’ => ‘sf-menu’, //ul标签class
‘menu_id’ => ‘topnav’,//ul标签id
‘echo’ => true,//是否打印,默认是true,如果想将导航的代码作为赋值使用,可设置为false
‘fallback_cb’ => ‘wp_page_menu’,//备用的导航菜单函数,用于没有在后台设置导航时调用
‘before’ => ”,//显示在导航a标签之前
‘after’ => ”,//显示在导航a标签之后
‘link_before’ => ”,//显示在导航链接名之后
‘link_after’ => ”,//显示在导航链接名之前
‘items_wrap’ => ‘<ul id=”%1$s”>%3$s</ul>’,
‘depth’ => 0,////显示的菜单层数,默认0,0是显示所有层
‘walker’ => ”// //调用一个对象定义显示导航菜单 ));
?>

为了能够使后台支持自定义菜单,我们需要在主题下functions.php下 加入register_nav_menus():

 
//自定义菜单
if(function_exists(‘register_nav_menus’)){
register_nav_menus(
array(
‘header-menu’ => __( ‘导航自定义菜单’ ),
// 还可以在这里添加一些菜单 显示在其他位置
//footer-menu=>__( ‘页面底部自定义菜单’ ),
)
);
}

在添加之后,你就会发现inove主题支持一个菜单了。
然后在inove主题后台编辑里找到header.php,我是这样添加的:


 <?php
wp_nav_menu(array(
‘theme_location’=>’header-menu’,//填写需要显示的菜单 这是是header的菜单
//还可以做其他设置这里选择默认
));
?>

去除inove主题自带的菜单:
只要将


<?php
if($options['menu_type'] == ‘categories’) {
wp_list_categories(‘title_li=0&orderby=name&show_count=0′);
} else {
wp_list_pages(‘title_li=0&sort_column=menu_order’);
}

好了大功告成,当然还可以添加一些样式,二级菜单也可以使用css控制一下!
注:添加之后我在修改栏目的时候出现 “Warning: Cannot modify header information – headers already ….”的错误的(没有错误的可以忽略)
register_nav_menus方法添加在functions.php末尾了,我将它放在类iNoveOptions结束的下面就好了!

WordPress 新文章实现同步图文新浪微博

经常上新浪微博并且关注了不少官网认证号的小伙伴一定会发现很多官方性质的微博都会把网站的最新文章或者动态同步到新浪微博这样一来就可以让微博用户快速的了解到网站的最新动态,并且也为网站增加了一个曝光以及流量入口,对于更新频繁的网站来说增加一个同步网站动态到微博的功能是非常有必要的,也不扯淡了,直接上代码:

class sync_sina {
 
    public $access_token = "";//access_token
    
    public $default_image = "";//默认图片地址
 
    public $host = "https://api.weibo.com/2/";
       
    public static $boundary = '';
       
    function __construct(){
        /**
         ** 事件绑定
         **/
        add_action('publish_post', array($this, 'new_post_photo'));
    }
 
    function do_mu_post($url, $data) {
        $ch = curl_init ();
        $headers = array("Content-Type:multipart/form-data;boundary=". self::$boundary);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE );
        curl_setopt ( $ch, CURLOPT_POST, TRUE );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
        curl_setopt ( $ch, CURLOPT_URL, $url );
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        $ret = curl_exec ( $ch );
        curl_close ( $ch );
        return $ret;
    }
 
    function build_http_query_multi($params) {
        if (!$params) return '';
        uksort($params, 'strcmp');
        $pairs = array();
        self::$boundary = $boundary = uniqid('------------------');
        $MPboundary = '--'.$boundary;
        $endMPboundary = $MPboundary. '--';
        $multipartbody = '';
        foreach ($params as $parameter => $value) {
            if( in_array($parameter, array('pic', 'image')) && $value{0} == '@' ) {
                $url = ltrim( $value, '@' );
                $content = file_get_contents( $url );
                $array = explode( '?', basename( $url ) );
                $filename = $array[0];
                $multipartbody .= $MPboundary . "\r\n";
                $multipartbody .= 'Content-Disposition: form-data; name="' . $parameter . '"; filename="' . $filename . '"'. "\r\n";
                $multipartbody .= "Content-Type: image/unknown\r\n\r\n";
                $multipartbody .= $content. "\r\n";
            } else {
                $multipartbody .= $MPboundary . "\r\n";
                $multipartbody .= 'content-disposition: form-data; name="' . $parameter . "\"\r\n\r\n";
                $multipartbody .= $value."\r\n";
            }
        }
        $multipartbody .= $endMPboundary;
        return $multipartbody;
    }
 
    function get_image($post_id){
        if( has_post_thumbnail($post_id) ){
            $timthumb_src = wp_get_attachment_image_src(get_post_thumbnail_id($post_id),'full');
            $output = $timthumb_src[0];
        } else {
            $content = get_post_field('post_content', $post_id);
            $defaltthubmnail = $this->default_image;
            preg_match_all('/<img.*?(?: |\\t|\\r|\\n)?src=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\r|\\n)+.*?)?>/sim', $content, $strResult, PREG_PATTERN_ORDER);
            $n = count($strResult[1]);
            if($n > 0){
                $output = $strResult[1][0];
            } else {
                $output = $defaltthubmnail;
            }
        }
        return $output;
    }
 
    function new_post_photo($post) {
        global $post;
        if( $post->post_status != "publish" ){
            $token = $this->access_token;
            $url = $this->host ."statuses/upload.json";
            $status = "我刚刚发布了新文章《".get_the_title()."》。".get_permalink();
            $status .= mb_strimwidth(strip_tags(apply_filters('the_content', $post->post_content)), 0,180,"..."); //顺手加了个文章摘要,不喜欢就去掉啦
            $pic_path = self::get_image($post->ID);
            $params = array();
            $params['access_token'] = $token;
            $params['status'] = $status;
            $params['pic'] = '@'.$pic_path;
            $body = self::build_http_query_multi($params);
            $result = self::do_mu_post($url,$body);
 
        }
    }
}
$HMT = new sync_sina();

以上代码添加至主题functions.php文件即可。

注:

需要服务器支持file_get_contents函数以及curl组件;
如果网站在国外服务器或者服务因特殊原因屏蔽了api.weibo.com域名,则可能造成发布文章卡死或者超时的问题。
如果网站未通过新浪审核微博小尾巴会显示为未审核应用。

让WordPress不同分类目录的文章调用不同的模板

近日,因为网站建设的需要,在没有使用自定义文章类型的情况下,使用不同的分类目录里的文章调用不同的模板,作为注册弗洛鱼的见面礼。

首先在function.php里,添加如下代码:

//获取并输入某个分类的子分类
function post_is_in_descendant_category( $cats, $_post = null )
{
foreach ( (array) $cats as $cat ) {
// get_term_children() accepts integer ID only
$descendants = get_term_children( (int) $cat, 'category');
if ( $descendants && in_category( $descendants, $_post ) )
return true;
}
return false;
}

复制一份single.php,命名为:single-*.php文件名(你可以根据自己的需要,制作多个 single-*.php 文件,通过修改每个single-*.php 文件的html结构和添加对应的CSS,就可以实现不同的文章页面样式 )。

将 single.php 里面除了 get_header(); get_footer(); get_sidebar(); 之外的所有内容改成:

注:该文章的方法就是使用 in_category() 函数来判断,不同的地方就是添加了自定义函数 post_is_in_descendant_category() 来获取某个分类的子分类。

wordpress代码实现站内搜索结果页面URL地址伪静态方法

wordpress默认的链接是动态的形式,大家都喜欢搞搞SEO,变换下链接地址,于是wordpress伪静态就登场了。伪静态的链接更具有层级结构关系,更有利于蜘蛛抓取,不同的web环境伪静态链接规则也不一样,整理了几种,方便大家参考。

apache环境下的wordpress伪静态规则

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

新建一个.htaccess文件并将以上代码写入.htaccess文件中,上传至wordpress站点的根目录中。

IIS环境下的wordpress伪静态规则

方法1、打开站点根目录下的web.config文件并加入以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <system.webServer>
 <rewrite>
 <rules>
 <rule name="category">
 <match url="category/?(.*)" />
 <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
 <action type="Rewrite" url="/index.php?category_name={R:1}" appendQueryString="false" logRewrittenUrl="false" />
 </rule>
 <rule name="tags">
 <match url="tag/?(.*)" />
 <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
 <action type="Rewrite" url="index.php?tag={R:1}" />
 </rule>
 <rule name="Main Rule" stopProcessing="true">
 <match url=".*" />
 <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
 <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
 </conditions>
 <action type="Rewrite" url="index.php/{R:0}" />
 </rule>
 <rule name="wordpress" patternSyntax="Wildcard">
 <match url="*" />
 <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
 <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
 </conditions>
 <action type="Rewrite" url="index.php" />
 </rule></rules>
 </rewrite>
 </system.webServer>
</configuration>

方法2、新建一个httpd.ini文件并加入以下代码:

[ISAPI_Rewrite]
# Defend your computer from some worm attacks
#RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32
# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
# Rules to ensure that normal content gets through
RewriteRule /tag/(.*) /index\.php\?tag=$1
RewriteRule /software-files/(.*) /software-files/$1 [L]
RewriteRule /images/(.*) /images/$1 [L]
RewriteRule /sitemap.xml /sitemap.xml [L]
RewriteRule /sitemap.xml.gz /sitemap.xml.gz [L]
RewriteRule /robots.txt /robots.txt [L]
RewriteRule /favicon.ico /favicon.ico [L]
# For file-based wordpress content (i.e. theme), admin, etc.
RewriteRule /wp-(.*) /wp-$1 [L]
# For normal wordpress content, via index.php
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]

上传至wordpress站点根目录。

nginx环境下的wordpress伪静态方法

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

将以上代码加入到nginx.conf文件的Server段内。
这是目前比较流行的几种web配置的伪静态规则。