为wordpress添加用户自定义头像功能

WordPress系统默认使用Gravatar头像,用户(包括访客评论)的头像调取都是根据所留邮箱匹配的Gravatar头像。那已注册的用户可以本地自定义上传头像么?答案是可以的。

对于开放注册的多用户WordPress站点,提供用户自定义头像功能非常有必要,因为不是所有的用户都会使用Gravatar系统上传头像的。

而单用户的博客网站本地上传头像也有一定的使用场景:例如我拥有多个WordPress站点,共用同一个邮箱。但是由于站点性质不同,需要展示不同的头像,就需要自定义头像了。

下面给出方法:

1、使用Simple Local Avatars插件

站长可以在WordPress后台直接搜索插件Simple Local Avatars进行在线安装,启用之后可以在仪表盘-用户-我的个人资料进行头像设置,同理管理员也可以修改其他用户头像。

2、纯代码配置

Simple Local Avatars插件实际上只有一个文件,我们可以直接将代码集成到主题,将代码直接放入functions.php文件即可。

由于代码较长,笔者强烈建议将其写成单独文件,并在在functions.php引入。

方法:下载author-avatars.php文件,点击下载 ,密码:a35l

放入主题文件夹(如笔者将此类功能都放入主题中的includes文件夹)然后在functions.php引入

//用户自定义头像功能
include (TEMPLATEPATH . '/includes/author-avatars.php');

至此,你的WordPress站点已经支持用户自定义头像了,如果用户同时设置了Gravatar和本地上传头像,那么优先显示本地上传的头像,头像调取函数不变:get_simple_local_avatar 或 get_avatar。

如何对表单输入框的placeholder的文字进行自定义

对textarea中的placeholder的文字做自定义示例如下:

<textarea data-role="none" class="feedbackcontent" id="feedbackcontent" name="feedbackcontent" placeholder="请输入您的意见"></textarea>
#feedbackcontent::-webkit-input-placeholder{color:red;}

这样,文字“请输入您的意见“ 就会变成红色,如果设置了没有变化,我们可以提升一下优选级,加一个 !important,或者是把这个输入框添加一个ID。

同样的,input,select,这些也是一样的:

input::-ms-input-placeholder{color:#fff !important}
input::-webkit-input-placeholder{color:#fff !important}
input::-moz-placeholder{color:#fff !important}
textarea:-webkit-placeholder{color:#fff !important}
textarea:-ms-placeholder{color:#fff !important}
textarea:-moz-placeholder{color:#fff !important}

这样输入框中的placeholder文字会变成白色的。其他其他具体样式自己设置。如果没有变化,那么同样的为这个输入框区域添加一个ID或者提升权限。基本没有什么问题。

 

装win10系统的时候遇到的问题

这几天在帮一个朋友安装windows10系统的时候,即使格式化后,通过USB安装系统,仍旧不成功,我就很纳闷,在想到底是怎么回事呢。

后来看到下面一个报错提示,大概就是:Windows 无法安装到这个磁盘。选中的磁盘具有 MBR 分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘。

后来查了下,发现这个是我在启动项的时候引导采用的是EFI的,应该把首选启动项改成非EFI的USB就行了,进入过BIOS的人都知道,U盘插入的时候,里面有个EFI XXX(U盘名字)和一个XXX(U盘名字),这个是设置开机启动项设置的MBR。所以修改这里就行了。

当然,为了能够安装一个干净的系统,为了成功的安装这个系统,我把磁盘的数据全部擦除了,很费时。其实不需要这一步,只要格式化一下,然后分区,格式化C盘,把C盘设置成主分区,而不是逻辑分区,这个很重要,C盘之外分区,比如D盘设置成逻辑分区即可。

有的时候可能这样做了还是不行,这个取决于我们的电脑的主板,有一次笔者在帮助公司安装点的时候发现,我在BIOS里面发现没有非EFI的选项,所以以上方案是不行的。

这里我还是通过进入PE系统,用澳梅磁盘分区助手,进入后选择磁盘(不是磁盘中的某个分区盘),如果你的电脑有两个磁盘,你选择其中一个,然后在左边就有一个把MBR转GPT磁盘,这样的话就可以把选择的这个磁盘变成了GPT了,然后,格式化磁盘,提交保存。

接下来,我们需要注意的一点:

在一个电脑硬盘中只允许有两个主分区,5个逻辑分区(实际上,我发现我要安装的那台电脑有很多个主分区),而我在完成以上的那些后,再进安装win10的时候,还是提示:找不到分区,也没法新建分区,这个说明是主分区太多,不能多于2个,所以需要删除一些。

然后,笔者就把多余的主分区全部删除,只保留了两个主分区(C盘是其中一个),由于是重新安装一个干净的系统,所以我把重新分好去的磁盘都格式化了:

C盘为主分区放系统(转成GPT,然后格式化);

D盘也作为主分区,当然也可以不做主分区,这个看个人喜好;

E盘逻辑分区;

H盘逻辑分区。

wordpress 数据库操作WPDB对象($wpdb)用法

使用wordpress的时候,如果想直接使用WP里封装的数据库操作的类(wp-db.php),将wp-blog-header.php包含到代码中就可以使用了。

define('PATH', dirname(dirname(__FILE__)).'/');
require_once(PATH . '../wp-blog-header.php');
global $wpdb;

插入数据时,其中一种方法是使用wp-db类中的insert()函数。

$table = "test_table";
$data_array = array(
'column_1′ => ‘data1′,
'column_2′ => ‘data2′
);
$wpdb->insert($table,$data_array);

第一个参数是数据库表中的名字,第二个参数是要插入的数据,是一个数组。数组中的key的名字就是表中的列名。其实insert()函数还有第三个参数format,感兴趣的朋友可以在wp-db.php的方法定义里看看更新数据时,可以用update()函数,例如:

$table = "test_table";
$data_array = array(
 'column_1′ => 'new_data1′
);
$where_clause = array(
'column_2′ => 'data2′
);
$wpdb->update($table,$data_array,$where_clause);

要从数据库中取数据,也有很多种方法,其中一种如下:

$querystr = "SELECT column_1 FROM test_table";
$results = $wpdb->get_results($querystr);
$i=0;
while ($i< count($results)){
echo $results[$i]->column_1."<br />";
$i++;
}

查询

<?php $wpdb->query("DELETE FROM $wpdb->post WHERE post_id = ’13′ "); ?> 

其中query的参数是任何mysql语句。返回值是有多少行被选出、影响。如果出错返回FALSE。

选出一个变量

<?php $wpdb->get_var('query',column_offset,row_offset); ?> 

其中query为要查询的mysql语句,如果为空的话,则表示从cache中选出。column_Offset和row_offet表示制定query返回值的第几列和第几行,缺省值为零。典型用法为:

<?php $user_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users;"));?>

这个sql只选出一个值,缺省的0行0列,即表示选出用户数目。目前还不清楚,这里为什么总是要加prepare在前面。

选出一行

<?php $wpdb->get_row('query', output_type, row_offset); ?> 

query为要执行的mysql语句,output_type表示返回值是object,hash或者是数组;row_offset表示第几行。

缺省情况下output_type为object。

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10");
echo $mylink->link_id; // prints "10"

如果output_type=ARRAY_A,那么:

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A);
echo $mylink['link_id']; // prints "10"

如果output_type=ARRAY_N,那么:

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_N);
echo $mylink[1]; // prints "10"

选出一列

<?php $wpdb->get_col('query',column_offset); ?>

一般选出

//$wpdb->get_results('query', output_type);
<?php
$fivesdrafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts
WHERE post_status = 'draft' AND post_author = 5");

foreach ($fivesdrafts as $fivesdraft) {
echo $fivesdraft->post_title;
}

插入一行

//<?php $wpdb->insert( $table, $data, $format ); ?>
<?php $wpdb->insert('table', array('column1' => 'value1', 'column2' => 123 ), array('%s','%d') ) ?>

更新

1 //$wpdb->update( $table, $data, $where, $format = null, $where_format = null );
2 <?php $wpdb->update( 'table', array( 'column1' => 'value1', 'column2' => 'value2' ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) ) ?>

关于wpdb prepare
前面提到不清楚为什么每个mysql语句都会包在prepare中,这里给出解释:因为mysql语句中可能含有单引号双引号这样的字符,如果不加 处理直接送给mysql,可能会导致错误。于是这里通过一个prepare来对mysql语句进行预处理。prepare的语法是:

1 $sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] );

在query中可以包含%d,%S,%f,分别表示后面参数的类型是整数,字符和浮点,如果要显示%号,则用%%,语法和C语言里面的printf基本一样。

到这里基本上就讲完了。对一般数据库的处理应该都没有问题了。如果碰到问题可以在本文开始时提到的那篇文章中去查阅。

$wpdb是一个全局变量,包含多个关于数据库查询函数:

 1 $wpdb -> get_results('query');
 2 $wpdb->query('query');
 3 $wpdb->get_var('query',column_offset,row_offset);
 4 $wpdb->get_row('query', output_type, row_offset);
 5 $wpdb->get_col('query',column_offset);
 6 $wpdb->get_results('query', output_type);
 7 $wpdb->insert( $table, $data, $format );
 8 $wpdb->update( $table, $data, $where, $format = null, $where_format = null );
 9 $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] );
10 $wpdb->show_errors();
11 $wpdb->hide_errors();
12 $wpdb->print_error();
13 $wpdb->get_col_info('type', offset);
14 $wpdb->flush();

get_row方法读取数据库中某一行的数据

从某个查询中检索一整行内容,可使用get_row函数。该函数可将行作为对象、关联数组或数值索引数组返回。如果查询返回了多个行,函数只返回指定行,但所有返回的行都将被缓存以供日后使用。

<?php $wpdb->get_row("query",output_type,row_offset);?>

query:(字符串)你希望执行的查询语句。

output_type:三个预定义的常量之一。默认值为OBJECT。

  • OBJECT —— 返回的结果以对象形式输出
  • ARRAY_A ——返回的结果以关联数组形式输出
  • ARRAY_N —— 返回的结果以数值索引数组形式输出

row_offset:(整数)预计的数据库表的行数(0为表中第一行)。默认值为0。

示例

e.g.1?获取ID为10的链接的所有资料。

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10");

$mylink对象的属性即SQL查询结果的行名称(在该例中,即 $wpdb->links表中的所有行)。

echo $mylink->link_id; // prints "10"

使用

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A);

则会生成一个关联数组:

echo $mylink["link_id"]; // prints "10"

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_N);

则会生成一个数值索引数组:

echo $mylink[1]; // prints "10"

e.g.2 获取ID为2所在行中,post_date的值

$gr = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID = 2");
echo $gr->post_date;

e.g.3 获取ID为2所在行所有资料

$gr = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID = 2");
foreach($gr as $a){
echo $a."||";
}

e.g.4 获取ID为2的用户昵称和注册时间

$user = $wpdb->get_row("SELECT user_nicename,user_registered FROM $wpdb->users WHERE ID=2");
echo "$user->user_nicename <br /> $user->user_registered";

get_col方法选择表中某一列的值

要选择数据库表中的一列内容,可使用get_col函数。该函数输出一个空间数组,如果查询返回了多个列,函数只返回指定列,但所有返回的列都将被缓存以供日后使用。

<?php $wpdb->get_col("query",column_offset);?>

query:(字符串)你希望执行的查询。将该参数设为null会使函数返回上一个查询的缓存结果中的执行表列。

column_offset:(整数)预计的数据库表的列数(0为表中第一列)。默认值为0。

示例

e.g.1 获取所有用户的邮箱

$wp_user_email = $wpdb->get_col("SELECT DISTINCT user_email FROM $wpdb->users");
foreach($wp_user_email as $a){
echo $a."<br />";
}

get_var方法读取数据库中某个字段变量的值

get_var函数返回一个来自数据库的变量。虽然只返回一个变量,但查询结果会被整体缓存,供后期使用。如果没有查询结果,返回NULL。

<?php $wpdb->get_var("query",column_offset,row_offset);?>

query:(字符串)你希望执行的查询。将该参数设为null会使函数返回上一个查询缓存结果中的具体变量。

column_offset:(整数)预计的数据库表的列数(0为表中第一列)。默认值为0。

row_offset:(整数)预计的数据库表的行数(0为表中第一行)。默认值为0。

示例

1. 检索并返回用户数量。

<?php
$user_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users;"));
echo "<p>User count is " . $user_count . "</p>";
?>

$wpdb->prepare是为了保护查询SQL注入攻击,官方 wpdb页面中搜索“Protect Queries Against SQL Injection Attacks“

也有人解释是We’ll add the ‘prepare’ method to make sure we’re not dealing with an illegal operation or any illegal characters 大概的意思是”我们用添加prepare的方式来确定没有用一个非法操作或任何非法字符来进行处理“

2. 检索并返回自定义字段值的总数

<?php
$meta_key = "miles";//set this to appropriate custom field meta key
$allmiles=$wpdb->get_var($wpdb->prepare("SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key));
echo "<p>Total miles is ".$allmiles . "</p>";
?>

git永久记住用户名和密码

在使用git时,如果用的是HTTPS的方式,则每次提交,都会让输入用户名和密码,久而久之,就会感觉非常麻烦,那么该如何解决呢?

方式一:使用SSH,添加ssh key。

方式二:在全局中存储用户的账号密码,方式如下

在%HOME%目录中,一般为C:\users\Administrator,也可以是你自己创建的系统用户名目录,反正都在C:\users***中。创建.git-credentials文件。

Windows中创建以.开头的文件的方法:

1:新建test.txt记事本,然后另存为.git-credentials

示例

2:使用git bash

touch .git-credentials

创建完成后,在该文件中输入:

https://username:password@github.com

注:username对应你的用户名,password对应你的密码

然后再进入git bash中

git config --global credential.helper store

store为永久存储,当然也可以设置临时的

git config –global credential.helper cache

默认为15分钟,如果想设置保存时间的话,可以输入:

git config credential.helper 'cache –timeout=3600'

这样就设置了一个小时的有效时间。

执行完后查看%HOME%目录下的.gitconfig文件,会多了一项:

[credential]helper=store

重新开启git bash会发现git push时不用再输入用户名和密码

方式三:单独对某个项目免密

如果还未添加远程地址,可以输入一下命令:

git remote add origin https://username:password@git.oschina.net/diligentyang/ysy107lab.git

如果已添加远程地址

最为简单的方式就是,直接在.git/config文件中进行修改,按如上格式,添加用户名和密码

WordPress自动采集发布插件WP-AutoPost使用教程

WP-AutoPost是目前最好用的WordPress自动采集发布插件,最大的特点是可以采集来自于任何网站的内容并自动发布到你的WordPress站点。不像其他大部分WordPress采集插件,只能根据Feed进行采集,使用Feed采集有很大的弊端,首先必须找到全文Feed,而现在网上全文Feed很少,大部分只能采集到文章摘要,就算使用Feed采集到文章摘要也需要点击链接才能查看原文,相当于给别的网站做外链。做英文垃圾站用的比较多的WP-Robot也只有20几个采集来源,文章来源比较单一有限。而WP-AutoPost就没有上面这些劣势,真正做到可以采集任何网站的内容并自动发布,采集过程完全自动进行无需人工干预,并提供内容过滤、HTML标签过滤、关键词替换、自动链接、自动标签、自动下载远程图片到本地服务器、自动添加文章前缀后缀、并且可以使用微软翻译引擎将采集的文章自动翻译为各种语言进行发布。
WP-AutoPost中文免费下载地址 http://wp-autopost.org/zh
一、安装WP-AutoPost
和安装其他WordPress插件一样,直接上传到插件目录,激活即可使用,无需再进行额外设置或修改代码。
二、创建采集任务
点击“新建任务”后,输入任务名称,即可创建新任务,创建好新任务之后可以在任务列表中查看到该任务,就可对该任务进行更多设置。

三、基本设置功能

在基本设置选项卡下,可以进行如下设置:

  • 任务名称:可以修改任务名称
  • 分类目录:该任务采集文章发布到的分类目录
  • 作者:该任务采集文章的发布作者,必须是WordPress里的注册用户
  • 更新时间间隔:间隔多长时间检测一次该采集任务下是否有新文章可以更新
  • 字符集:采集目标网站的字符集编码,默认为UTF8,如果目标网页字符集编码不是UTF8,抓取的网页会出现乱码,设置正确的字符集即可解决该问题(如何正确设置字符集
  • 下载远程图片:如果该任务下采集的文章里包含图片,可以选择是否下载远程图片到本地服务器,选择下载远程图片,可进一步选择是否将下载的图片信息保存到WordPress媒体库中
  • 自动标签:选择是否使用自动标签
  • 标签列表:使用自动标签后如果文章包含列表里的关键词,将自动添加标签
  • 匹配完整的单词:该设置对英文文章有效,中文文章请勿启用该设置

四、文章来源设置

在该选项卡下我们需要设置文章来源的 文章列表网址及 具体文章的匹配规则

我们以采集“新浪互联网新闻”为例,文章列表网址为http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 因此在 手工指定文章列表网址 中输入该网址即可,如下所示:

之后需要设置该文章列表网址下具体文章网址的匹配规则

五、文章网址匹配规则

文章网址匹配规则的设置非常简单,无需复杂设置,提供两种匹配模式,可以使用URL通配符匹配,也可以使用CSS选择器进行匹配,通常使用URL通配符匹配较为简单。

1. 使用URL通配符匹配

通过点击列表网址 http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 上的文章,我们可以发现每篇文章的URL都为如下结构

http://tech.sina.com.cn/i/2013-06-27/16328485884.shtml

因此将URL中变化的数字或字母替换为通配符 (*) 即可,如:http://tech.sina.com.cn/i/(*)/(*).shtml

2. 使用CSS选择器进行匹配

使用CSS选择器进行匹配,我们只需要设置 文章网址的CSS选择器 即可(不知道CSS选择器为何物,一分钟学会如何设置CSS选择器),通过查看列表网址 http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 的源代码即可轻松设置,找到该列表网址下具体文章的超链接的代码,如下所示:

可以看到,文章的超链接a标签在class为“contList”的标签内部,因此 文章网址的CSS选择器 只需要设置为 .contList a  即可,如下所示:

设置完成之后,不知道设置是否正确,可以点击上图中的测试按钮,如果设置正确,将列出该列表网址下所有文章名称和对应的网页地址,如下所示:

六、文章抓取设置

在该选项卡下,我们需要设置文章标题和文章内容的匹配规则,提供两种方式进行设置,推荐使用CSS选择器方式,使用该方式更为简单,精确。

我们只需要设置文章标题CSS选择器文章内容CSS选择器,即可准确抓取文章标题和文章内容。

在文章来源设置里,我们以采集”新浪互联网新闻“为例,这里还是以该例子讲解,通过查看列表网址 http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 下某一篇文章的源代码即可轻松设置,例如,我们通过查看某篇具体文章 http://tech.sina.com.cn/n/i/2013-06-10/06308430630.shtml 的源代码,如下所示:

可以看到,文章标题在id为“artibodyTitle”的标签内部,因此文章标题CSS选择器只需要设置为#artibodyTitle 即可;

同样的,找到文章内容的相关代码:

可以看到,文章内容在id为“artibody”的标签内部,因此文章内容CSS选择器只需要设置为 #artibody 即可;如下所示:

设置完成之后,不知道设置是否正确,可点击测试按钮,输入测试地址,如果设置正确,将显示出文章标题和文章内容,方便检查设置

七、抓取文章分页内容

如果文章内容过长,有多个分页同样可以抓取全部内容,这时需要设置文章分页链接CSS选择器,通过查看具体文章网址源代码,找到分页链接的地方,例如某篇文章分页链接代码如下:

可以看到,分页链接A标签在class为 “page-link” 的标签内部

因此,文章分页链接CSS选择器设置为 .page-link a 即可,如下所示:

如果勾选当发表时也分页时,发表文章也将同样被分页,如果你的WordPress主题不支持 <!- – nextpage – -> 标签,请勿勾选。

八、文章内容过滤功能

文章内容过滤功能,可过滤掉正文中不希望发布的内容(如广告代码,版权信息等),可设置两个关键词,删除掉两个关键词之间的内容,关键词2可以为空,表示删除掉关键词1之后的所有内容。

如下所示,我们通过测试抓取文章后发现文章里有不希望发布的内容,切换到HTML显示,找到该内容的HTML代码,分别设置两个关键词即可过滤掉该内容。

如上所示,如果我们希望过滤掉上面<div class=”ep-source cDGray”>和</div>之间的内容,添加如下设置即可

如果需要过滤掉多处内容,可以添加多组设置。

九、HTML标签过滤功能

HTML标签过滤功能,可过滤掉采集文章中的超链接(a标签),<script>和<style>等标签下不必要的代码。

下面是几个例子:

  • 如果需要过滤掉文章中的超链接,只需输入 a 即可,是否删除标签内容 选择否
  • 如果要过滤掉文章中包含的<script>或<style>不必要的代码,只需输入对应标签名称,是否删除标签内容选择是

十、关键词替换、自动添加自定义超链接

可以将正文或标题中的关键词进行替换,同时也支持正文自定义超链接;

例如:需要将文章里的wordpress自动添加链接到http://wordpress.org/,只需设置 wordpress 替换为 <a href=”http://wordpress.org/”>wordpress</a> 即可

如下所示:

十一、解决乱码问题

为什么产生乱码

WP-AutoPost 采集网页时默认字符集为UTF-8,如果目标网页的字符集不是UTF-8,采集的内容可能会出现乱码。

解决乱码问题

解决方法非常简单,只需查看目标网页的字符集,设置正确的字符集即可。

打开目标网页源代码,一般在最前面的位置,找到有charset的代码部分:

如上所示,该网页的目标编码为gb2312,设置相同的字符集即可: