网站建设 – glenlau刘国良的博客 https://www.glenlau.cn 专注网络营销推广SEM,搜索引擎优化及WordPress网站建设 Wed, 10 Oct 2018 08:18:21 +0000 zh-CN hourly 1 流量运营之别让虚假流量欺骗了你https://www.glenlau.cn/traffic-operation.html https://www.glenlau.cn/traffic-operation.html#respond Thu, 22 Mar 2018 07:45:26 +0000 https://www.glenlau.cn/?p=849 流量运营

本文章主要对流量中的灰色地带:虚假流量展开分析,一起来看看。据官方统计数据,2016年虚假流量就给全球广告主造成了76亿美元的直接经济损失,除了直接经济损失外,更加多样的流量造假方式,也带来了更多的“副作用”。

The post 流量运营之别让虚假流量欺骗了你 appeared first on glenlau刘国良的博客.

]]>
流量运营

今天我们来聊一下,流量中的灰色地带–虚假流量,据官方统计数据,2016年虚假流量就给全球广告主造成了76亿美元的直接经济损失,除了直接经济损失外,更加多样的流量造假方式,也带来了更多的“副作用”。

如无效的用户定位,广告出现在了不该出现的媒体上面,吸引了不该吸引的用户,白白浪费流量,更有甚者,如果把流量导流到了美女游戏页面,那么对品牌形象也会产生负面影响。

虚假流量是如何产生的

整个广告生态会涉及三方角色:广告主、媒体(卖广告的)、用户(看广告的)。媒体是不会承诺效果的,但是如果你反馈曝光量和点击量不够,媒体是可以给你再补量的。给你补的量多了,势必造成其它家量少,间接造成竞争加剧,流量价格也越来越高,但是只有曝光点击没有转化也是没有用的,于是更多的广告主更倾向于用户转化作为考核指标,而忽略了其它考核指标如CPC、CPM,只会让竞争更加加剧,造成恶性循环,从而导致了虚假流量的产生。

我们知道用户一般会在三次或三次以上访问后最终才能决定转化,他的整个生命周期决定了最后的转化,某些渠道虽然不擅长转化,但是它对其它渠道有助攻作用,所以不能一刀切。

另外,如果把和渠道结算的指标定为CPS、CPA就万事大吉了吗?有利益驱使的地方就有魔鬼。所以我们需要一整套完整的策略为渠道保驾护航。

甄别虚假流量

在研究虚假流量之前,还有一种流量需要引起我们的注意,那就是异常流量,异常流量通常混杂在虚假流量中间,扰乱我们的判断。所以首先我们要区分什么是虚假流量什么是异常流量?

如果出现了以下情况,多半可以认为是异常流量,当然这需要沟通多方然后去判断:

  • 投放的媒体出现了问题,投放的页面宕机了
  • 打的链接参数缺失或者丢失导致代码失效
  • 埋点采集异常
  • 数据通路被无故屏蔽
  • 指标配置有问题

如果出现了以下情况,多半可以认为是虚假流量:

  • 刷量!
  • 刷量!!
  • 刷量!!!

对于如何避免异常流量,不是今天文章的重点,就不多说了,这需要公司内部规范化项目流程,各个环节把控好,才能有效规避。下面,我们详细说下如何排查出虚假流量的蛛丝马迹。

流量全流程数据监控

我们需要将流量数据、行为数据和转化数据通过一定的数据采集手段,来获取完整、全面和准确的数据,目的是将全流程数据打通,只有获取了完整全面的数据我们才能找到虚假流量的踪迹。下图是流量转化的完整过程:

流量运营
流量运营

这个过程我们面临了两个难题:

  1. 展示和点击数据都在第三方广告投放平台,我们不能获得用户的详细信息
  2. 前后端数据存在割裂,只能统计到前端的点击转化,不知道后续业务转化如何

所以好多渠道作弊方,会在这两个方面做文章,钻渠道的空子,通过程序或者雇佣人肉等人为操作产生流量,人为操作可能是点击你的广告、访问推广落地页,或者完成某个简单的任务,比如点击Call to Action按钮,这种流量通常不会带来实际的转化,上面也说了因为转化的业务数据不能获得,抓不到证据也就不好衡量,所以就只能呵呵了。

作弊流量是不能避免的,我们只能靠增加技术壁垒,增加作弊的成本,作弊的成本高了,一定程度会减少作弊的现象。

数据预处理

我们可以在流量正式到达落地页之前,在展示点击阶段和到达产品落地页之间构建一层屏障,即通过数据预处理手段,通过一定的反作弊规则先把某些行为可疑或者不需要的流量过滤掉:

  • 过滤某些已知IP段,如内网IP、测试IP
  • 设备号异常:如频繁重置idfa
  • IP异常:定位的IP来自莫名其妙的地方
  • 行为异常:如频繁刷新页面
  • 数据包不够完整:只有启动信息,没有页面、事件等其他用户行为信息

这样我们就能保证到达落地页的流量相对干净,但仍有落网之鱼,需要我们通过进一步的数据分析来找到虚假流量。

案例剖析虚假流量

我们先来看一组数据:

日均访问次数:10w+

跳出率:45%

平均每次访问页数:3.2

平均每次访问停留时长:1分50秒

订单转化率:0.12%

这是我们某个电商类客户反馈出的问题,他们新上线了某个电商网站,从访问量、跳出率等这些指标来看表现都不错,偏偏订单转化率低,不知道怎么回事。

遇到这种情况,只能说别急,我们先从数据上细分看看。细分对虚假流量是致命的,因为通过细分我们一定能识别出虚假流量的模式和规律。

网站整体的访问量变化趋势

网站访问量变化趋势
网站访问量变化趋势

从上图可以看出,9月3号PV较平时较低;访问量和唯一身份访问用户数几乎相等,即人均访问次数接近与1,每个用户只访问了一次,月回访率很低。

新访占比和跳出率对比分析

新访占比和跳出率对比分析
新访占比和跳出率对比分析

从上图我们可以得出这些信息:

  1. 新用户占比接近于80%,说明新用户居多
  2. 跳出率在45%左右,跳出率很低,说明流量质量还可以

但是如果我们深入想一下,会发现有如下问题:

  1. 新用户占比和跳出率指标成反比关系,正常情况下,新用户占比和跳出率指标成正比关系,新用户占比高的话,跳出率也高
  2. 跳出率低,为什么转化率也那么低呢?

不同城市不同转化指标对比

不同城市不同转化指标对比
不同城市不同转化指标对比

我们找了流量排名Top8的城市的对比数据,这Top8的城市数据对流量贡献较大,且上海的销售额占总销售额的1/3左右,河南订单转化率较高。城市为“未知”的流量贡献也较大,跳出率低,但是订单转化率远小于0.01%。显示为未知,说明抓不到这些流量来自于哪个IP段,但是访问量足够大,所以需要引起注意,有作弊嫌疑。

未知城市不同时间段分类对比分析

选择了最近一个月的数据,看不同时段这些流量的分布情况(图略),发现凌晨1点到凌晨6点流量占总流量的25%,占比较高,更奇怪的是,晚间流量每个时段较平均,流量差不多,这是不符合常理的,需要进一步分析。

夜间流量分类对比分析

夜间流量分类对比分析
夜间流量分类对比分析

我们发现这些流量中72%的流量来自于广告系列,但是转化率较低,不知道具体哪个广告系列来源拉了后腿。

夜间流量广告系列来源占比分析

夜间流量广告系列来源占比分析
夜间流量广告系列来源占比分析

发现广告系列流量中大部分都来自于sm这个渠道,此时可以把分析范围缩小到sm这个渠道。

sm渠道指标整合分析

sm渠道指标整合分析
sm渠道指标整合分析

sm渠道的访问量很大,新用户占比90.31%,而跳出率为20.32%,转化率0.08%。基本可以断定是sm渠道出问题了。

sm渠道细分落地页和非活动页面数据表现

通过进一步细分,发现sm渠道大部分流量都流入了活动落地页(图略),跳出率低于23%,且每次访问的平均浏览深度接近于1,有趣的是,另一部分非活动落地页的,页面浏览深度在几百个页面,非正常人类行为,它的目的只是为了平均整体流量。

sm渠道活动落地页点击图分析

同时我们还可以结合不同落地页的点击图进行分析,你会发现更多有趣的现象。

至此,大功告成。

案例总结

从上面的案例我们看到通过层层细分,层层递进的方法我们找到了虚假流量,所以要想找出虚假流量,我们需要密切关注如下几个方面:

给渠道打好标记,目的方便分割流量

为每一个渠道打好UTM标记,那么渠道会贯穿于用户的整个访问过程中,方便按渠道分组查看每个渠道的表现,避免其它渠道的干扰。

流量产生的时间

找到异常流量发生的时间点,然后将时间细化到每小时的访问数据,如果流量过于集中在某个时段,或者在不恰当的时间点出现了流量激增的情况,这时候就要引起注意了。

流量的地理来源

通常情况下,访客会来自不同的地理位置,如果流量过于集中在某个地区,或者采集不到地区的地方出现了大量的流量等等都是很可疑的。

流量的用户终端

不同的渠道覆盖不同的用户群,所以各自的用户终端会有一定的区别。比如对于小米应用商店这个渠道来说,它的用户很可能排在前10的手机都是小米手机,而对移动MM来说,他们的用户都来自于移动运营商。排除这些特殊渠道的应用商店,大部分渠道的用户终端跟整个互联网终端分布是类似的。我们可以通过看行业报告或者查询数据指数产品来了解这些数据,把这些数据作为行业基准值,进行对比。另外我们还可以重点关注设备终端类型、操作系统、联网方式、运营商、地理位置等设备属性。

流量的跳出率和新访用户占比

跳出率和新访用户占比成正比关系,另外如果流量在某个时段跳出率突然增高,可以结合上述维度进行细分查看,哪个细分维度的跳出率增高。

流量的转化

很多作弊流量可以模仿人类行为,绕过跳出率、平均访问深度和停留时长这些宏观指标,但是要模仿一个业务转化就比较难了,如果宏观指标表现很好,业务转化很少的话,就需要提高警觉。

流量的留存

我们一般经常看的留存指标有次日留存、7日留存、30日留存,所以一些作弊渠道会专门针对这三个指标做手脚,所以除了看这三个指标外,建议将指标拓宽,关注每天的留存变化。

新流量过来的用户路径

新用户来到推广落地页后,一般会从落地页开始进行分流,他们会点击不同的链接,访问不同的页面,而作弊流量很难完成2-3次点击,即便完成了,点击的链接或内容也基本固定。

流量的功能访问分布分析

适当拉大时间维度,看某个渠道某个基本功能如浏览页面的访问频次分布,真实的访客是有再次回访行为的,而虚假流量一般是本次任务完成后是不会管后续收尾动作的,回访频率很低。

流量的单页面人均访问次数

如果某个落地页面的人均访问次数很高比如4次以上的话,就很可疑了,因为在一次访问中用户一般是不会多次浏览同一个落地页的。同时结合该页面在网站整体的人均访问次数进行对比,结果会更加准确。

流量的落地页点击热图分析

这需要借助一些热图工具,从热图工具中,作弊流量的蛛丝马迹更易发现。

本文内容转自互联网,如有侵权请联系博主删除

The post 流量运营之别让虚假流量欺骗了你 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/traffic-operation.html/rss/ 0
HTML语言中的块元素和内联元素介绍https://www.glenlau.cn/html-block-element-inline-element.html https://www.glenlau.cn/html-block-element-inline-element.html#respond Thu, 26 Oct 2017 01:40:42 +0000 https://www.glenlau.cn/?p=791 html标记语言

HTML语言中常见的两种元素:块元素又名块级元素(block element),和其对应的是内联元素(inline element),其中文叫法有多种,如:内联元素、内嵌元素、行内元素、直进式元素等;都是html规范中的概念。大多数HTML 元素被定义为块级元素或内联元素。块级元素在浏览器显示时,通常会以新行来开始(和结束)。

The post HTML语言中的块元素和内联元素介绍 appeared first on glenlau刘国良的博客.

]]>
html标记语言

块元素简介

    块元素又名块级元素(block element),和其对应的是内联元素(inline element),都是html规范中的概念。块元素和内联元素的基本差异是块元素一般都从新行开始,相邻的块级元素将会在不同行显示。而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异了。比如,我们完全可以把内联元素加上display:block这样的属性,让它也有每次都从新行开始的属性,即成为块元素同样我们可以把块元素加上display:inline这样的属性,让它也在一行上排列。

内联元素简介

    内联元素又名行内元素(inline element),和其对应的是块元素(block element),都是html规范中的概念。内联元素的显示,为了帮助理解,可以形象的称为“文本模式”,即一个挨着一个,都在同一行按从左至右的顺序显示,不单独占一行。而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异了。比如,我们完全可以把内联元素加上display:block这样的属性,让它也有每次都从新行开始的属性,即成为块元素同样我们可以把块元素加上display:inline这样的属性,让它也在一行上排列。

block元素的特点

  • 总是在新行上开始;
  • 高度,行高以及外边距和内边距都可控制;
  • 宽度缺省是它的容器的100%,除非设定一个宽度。
  • 它可以容纳内联元素和其他块元素

inline元素的特点

  • 和其他元素都在一行上;
  • 高,行高及外边距和内边距不可改变;
  • 宽度就是它的文字或图片的宽度,不可改变
  • 内联元素只能容纳文本或者其他内联元素

常见块元素(block element)

  • address – 地址
  • blockquote – 块引用
  • center – 居中对齐块
  • dir – 目录列表
  • div – 常用块级容器,也是css layout的主要标签
  • dl – 定义列表
  • fieldset – form 控制组
  • form – 交互表单
  • h1 – 大标题
  • h2 – 副标题
  • h3 – 3级标题
  • h4 – 4级标题
  • h5 – 5级标题
  • h6 – 6级标题
  • hr – 水平分隔线
  • isindex – input prompt
  • menu – 菜单列表
  • noframes – frames可选内容,(对于不支持frame的浏览器显示此区块内容)
  • noscript – 可选脚本内容(对于不支持script的浏览器显示此内容)
  • ol – 排序表单
  • p – 段落
  • pre – 格式化文本
  • table – 表格
  • ul – 非排序列表(无序列表)

常见内联元素(inline element)

  • a – 锚点
  • abbr – 缩写
  • acronym – 首字
  • b – 粗体(不推荐)
  • bdo – bidi override
  • big – 大字体
  • br – 换行
  • cite – 引用
  • code – 计算机代码(在引用源码的时候需要)
  • dfn – 定义字段
  • em – 强调
  • font – 字体设定(不推荐)
  • i – 斜体
  • img – 图片
  • input – 输入框
  • kbd – 定义键盘文本
  • label – 表格标签
  • q – 短引用
  • s – 中划线(不推荐)
  • samp – 定义范例计算机代码
  • select – 项目选择
  • small – 小字体文本
  • span – 常用内联容器,定义文本内区块
  • strike – 中划线
  • strong – 粗体强调
  • sub – 下标
  • sup – 上标
  • textarea – 多行文本输入框
  • tt – 电传文本
  • u – 下划线
  • var – 定义变量

可变元素

    可变元素由上下文语境来决定是块元素还是内联元素[1] 。

  • applet – java applet
  • button – 按钮
  • del – 删除文本
  • iframe – inline frame
  • ins – 插入的文本
  • map – 图片区块(map)
  • object – object对象
  • script – 客户端脚本

The post HTML语言中的块元素和内联元素介绍 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/html-block-element-inline-element.html/rss/ 0
如何在wordpress中直接执行sql语句https://www.glenlau.cn/wordpress-sql.html https://www.glenlau.cn/wordpress-sql.html#respond Tue, 02 May 2017 10:07:59 +0000 https://www.glenlau.cn/?p=492 如何在wordpress中直接执行sql语句

任何的系统都离不开数据库,用到数据库存就有sql查询语句 ,wordpress也不例外; 今天我们就来简单的介 […]

The post 如何在wordpress中直接执行sql语句 appeared first on glenlau刘国良的博客.

]]>
如何在wordpress中直接执行sql语句

任何的系统都离不开数据库,用到数据库存就有sql查询语句 ,wordpress也不例外; 今天我们就来简单的介绍一下在wordpress中直接执行sql查询语句的一些方法;

WordPress提供了一个类的操作数据库存的全局变量叫$wpdb,通过这个全局变量来与WordPress数据库进行关联,所以我们在使用之前,需要先定义下这个全局变量,写法如下:

<?php  global $wpdb;  ?> 

query 函数

执行数据库查询,可以通过 query 函数在WordPress数据库中执行任何SQL查询。Select查询只返回查询的结果数。

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

举个例子说明一下:删除ID为13的文章。

<?php    $wpdb->query("DELETE FROM $wpdb->posts WHERE post_id = '13' ");  ?>

get_var 函数

如果要选择一个变量,可以使用 get_var 函数返回一个来自数据库的变量。但只返回一个变量,如果没有查询结果,则返回NULL。

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

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

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

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

举例说明一下:检索并返回用户数量。

<?php  
      $user_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users;"));  
      echo '<p>用户一共有 ' . $user_count . '人</p>';   
?>  

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。

示例如下:获取ID为10的链接的所有信息。

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

 //$mylink对象的属性即SQL查询结果的行名称(即$wpdb->links表中的所有行)。
 echo $mylink->link_id; // prints "10"
 
 //使用ARRAY_A
 $mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A);     

 //则会生成一个关联数组:
 echo $mylink['link_id']; // prints "10"     

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

 //则会生成一个数值索引数组:
 echo $mylink[1]; // prints "10"
?> 

get_col函数

要选择数据库表中的一列内容,可使用get_col函数。该函数输出一个空间数组,如果查询返回了多个列。

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

参数说明:

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

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

例子如下: 返回指定文章类型的ID号

<?php
  $resaults = $wpdb->get_col("SELECT * FROM $wpdb->posts WHERE post_type = 'question'");        
  print_r($resaults);
?>

get_results 函数

查询结果集,get_results 函数可以从数据库中抽取函数生成的多行结果。$wpdb 函数以数组形式返回整个查询结果。

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

参数说明:

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

output_type
三个预定义的常量之一,默认值为 OBJECT; OBJECT —— 以对象形式输出返回的结果; ARRAY_A ——以关联数组形式输出返回的结果; ARRAY_N —— 以数值索引数组形式输出返回的结果。

示例说明: 返回指定文章类型的所有文章内容

<?php   
  $resaults = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_type = 'question'");  
  print_r($resaults);
?>  

上面介绍的就是WordPress数据库接口的查询部分,通过上面提供的方法我们可以使用SQL语句来对数据库内容进行操作,可以执行查询获取内容或更新/删除内容等。

附:wordpress中常用sql语句

1、开启所有评论

UPDATE wp_posts
SET comment_status = 'open'
WHERE post_status = 'publish';

2、关闭旧文章的留言

UPDATE wp_posts
SET comment_status = 'closed'
WHERE post_date < '2009-01-01' AND post_status = 'publish'

3、删除所有的垃圾评论

DELETE FROM wp_comments
WHERE comment_approved = 'spam'

4、删除所有文章修订版本(Revisions)以及它们的Meta数据

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

5、清理wp_postmeta表

DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';
DELETE FROM wp_postmeta WHERE meta_key = '_revision-control';
DELETE FROM wp_postmeta WHERE meta_value = '{{unknown}}';

好了,woprdpress 直接执行SQL查询就先介绍到这; 喜欢的就收藏下了。

The post 如何在wordpress中直接执行sql语句 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/wordpress-sql.html/rss/ 0
SQL关联查询 [收藏]https://www.glenlau.cn/sql-join.html https://www.glenlau.cn/sql-join.html#respond Fri, 21 Apr 2017 07:51:40 +0000 https://www.glenlau.cn/?p=487

inner join(等值连接)只返回两个表中联结字段相等的行 left join(左联接)返回包括左表中的所 […]

The post SQL关联查询 [收藏] appeared first on glenlau刘国良的博客.

]]>

inner join(等值连接)只返回两个表中联结字段相等的行

left join(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录

right join(右联接)返回包括右表中的所有记录和左表中联结字段相等的记录

INNER JOIN语法:

INNER JOIN连接两个数据表的用法:

SELECT * FROM 表1 INNER JOIN 表2 ON表1.字段号=表2.字段号

INNER JOIN连接三个数据表的用法:

SELECT * FROM (表1 INNER JOIN 表2 ON表1.字段号=表2.字段号) INNER JOIN 表3 ON表1.字段号=表3.字段号

INNER JOIN连接四个数据表的用法:

SELECT * FROM ((表1 INNER JOIN 表2 ON表1.字段号=表2.字段号) INNER JOIN 表3 ON表1.字段号=表3.字段号) INNER JOIN

表4 ON Member.字段号=表4.字段号

INNER JOIN连接五个数据表的用法:

SELECT * FROM (((表1 INNER JOIN 表2 ON表1.字段号=表2.字段号) INNER JOIN 表3 ON表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号

连接六个数据表的用法:略,与上述联接方法类似,大家举一反三吧:)

注意事项:

在输入字母过程中,一定要用英文半角标点符号,单词之间留一半角空格;
在建立数据表时,如果一个表与多个表联接,那么这一个表中的字段必须是“数字”数据类型,而多个表中的相同字段必须是主键,而且是“自动编号”数据类型。否则,很难联接成功。
代码嵌套快速方法:如,想连接五个表,则只要在连接四个表的代码上加一个前后括号(前括号加在FROM的后面,后括号加在代码的末尾即可),然后在后括号后面继续添加“INNER JOIN 表名X ON表1.字段号=表X.字段号”代码即可,这样就可以无限联接数据表了:)

1.理论

只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来。

个人理解:以一个共同的字段求两个表中符合要求的交集,并将每个表符合要求的记录以共同的字段为牵引合并起来。

语法

select * FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2

INNER JOIN操作包含以下部分:

部分

说明

table1, table2

要组合其中的记录的表的名称。

field1,field2

要联接的字段的名称。如果它们不是数字,则这些字段的数据类型必须相同,并且包含同类数据,但是,它们不必具有相同的名称。

compopr

任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或者“<>”。

说明

可以在任何 FROM子句中使用 INNER JOIN操作。这是最常用的联接类型。只要两个表的公共字段上存在相匹配的值,Inner联接就会组合这些表中的记录。

可以将 INNER JOIN用于 Departments及 Employees表,以选择出每个部门的所有雇员。而要选择所有部分(即使某些部门中并没有被分配雇员)或者所有雇员(即使某些雇员没有分配到任何部门),则可以通过 LEFT JOIN或者 RIGHT JOIN操作来创建外部联接。

如果试图联接包含备注或 OLE对象数据的字段,将发生错误。

可以联接任何两个相似类型的数字字段。例如,可以联接自动编号和长整型字段,因为它们均是相似类型。然而,不能联接单精度型和双精度型类型字段。

下例展示了如何通过 CategoryID字段联接 Categories和 Products表:

SELECT CategoryName, ProductName

FROM Categories INNER JOIN Products

ON Categories.CategoryID = Products.CategoryID;

在前面的示例中,CategoryID是被联接字段,但是它不包含在查询输出中,因为它不包含在 SELECT语句中。若要包含被联接字段,请在 SELECT语句中包含该字段名,在本例中是指 Categories.CategoryID。

也可以在 JOIN语句中链接多个 ON子句,请使用如下语法:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2 OR
ON table1.field3 compopr table2.field3;

也可以通过如下语法嵌套 JOIN语句:

SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN …)]
ON table3.field3 compopr tablex.fieldx)]
ON table2.field2 compopr table3.field3)
ON table1.field1 compopr table2.field2;

LEFT JOIN或 RIGHT JOIN可以嵌套在 INNER JOIN之中,但是 INNER JOIN不能嵌套于 LEFT JOIN或 RIGHT JOIN之中。

2.操作实例

表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115

表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408

实验如下:
1.left join

sql语句如下:
select * from A
left join B
on A.aID = B.bID

结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影响的行数为 5行)

结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.

2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影响的行数为 5行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID

结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404

结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.还有就是inner join可以结合where语句来使用如: select * from A innerjoin B on A.aID = B.bID where b.bname=’2006032401’这样的话就只会放回一条数据了.

The post SQL关联查询 [收藏] appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/sql-join.html/rss/ 0
WordPress过滤器(Filters)机制介绍https://www.glenlau.cn/wordpress-filters-action.html https://www.glenlau.cn/wordpress-filters-action.html#respond Tue, 21 Mar 2017 07:05:19 +0000 https://www.glenlau.cn/?p=480

Filters(过滤器)对于WordPress来说是非常重要的,它不仅极大地扩展了WordPress的定制能力 […]

The post WordPress过滤器(Filters)机制介绍 appeared first on glenlau刘国良的博客.

]]>

Filters(过滤器)对于WordPress来说是非常重要的,它不仅极大地扩展了WordPress的定制能力,而且还提高了WordPress的灵活性。无论是制作主题还是开发插件,我们基本上都会或多或少地使用到过滤器,以实现我们的一些特殊需求。

其实,WordPress的Filters的使用起来也是非常简单的,我们经常用到的也就是两个函数而已,它们就是apply_filters和add_filter。本文将对WordPress过滤器进行详细解读与分析。

什么是Filters(过滤器)?

下面就来说说什么是Filters(过滤器),过滤器就是注册到过滤器钩子(Filter Hook)的函数,过滤器钩子都有一个名字,在WordPress中,一般使用变量$tag来标识这个名字。所有挂接到过滤器钩子上的函数都是过滤器。

过滤器(Filters)钩子和动作(action)钩子一样,基本的函数有两个,动作钩子有do_action()函数,过滤器有apply_filters()函数;该函数是用于执行相应的过滤器函数,不同的是动作钩子仅仅是执行函数(或者称为动作,更为贴切),而过滤器钩子它要做的是通过执行过滤器函数来改变对象或变量的值,就相当于对变量或者对象进行过滤,然后再返回。

过滤器(Filters)钩子的相关函数介绍:

简单地说,动作(action)钩子要的是过程(仅仅执行代码块)而不是结果(输出值或返回值),而过滤器(Filters)钩子要的是结果而不是过程。apply_filters()函数的用法说明:

<?php
    apply_filters( $tag, $value, $var ... );
    //$tag 必需,过滤器钩子的名称
    //$value 必需,可以被过滤器函数修改的值
    //$var 可选,若干个可以传递给过滤器函数的参数
?>

同理,动作钩子有个函数是add_action,相应地,过滤器钩子也有个函数是add_filter。这两个函数的用法就完全一样了,实际上,add_action就是直接调用add_filter来实现的。add_filter函数的用法:

<?php
    add_filter( $tag, $function_to_add, $priority, $accepted_args );
    //$tag 必需,过滤器钩子的名称
    //$function_to_add 必需,要添加的过滤器函数
    //$priority 可选,过滤器函数的优先级,数值越小越先执行,默认值为10
    //$accepted_args 可选,过滤器函数接受的参数数量,默认值为1
?>

要注意的是,我们在前面说过,过滤器(过滤器函数)的任务是要改变对象或变量的值,所以通过add_filter函数添加的过滤器必须要有个返回值,也就是函数$function_to_add必需有返回值。

过滤器应用实例:

我们以wp_title()函数为例,为大家讲一下过滤器的实际用法,这个函数的定义在other/general-template.php文件中。在该函数的定义中,调用了apply_filters函数来执行相应的过滤器函数。代码如下:

$title = apply_filters('wp_title', $title, $sep, $seplocation);
//这里会执行过滤器函数,对变量$title进行过滤
//正因为这行代码的存在,你可以把你的过滤器函数添加进来,实现对$title的定制

那么,我们可以在该过滤器钩子(wp_title)上添加一个过滤器来改变$title的值。代码如下:

<?php
    add_filter('wp_title', 'mytitle');
    //把函数mytitle挂接到过滤器钩子wp_title上
    //定义过滤器函数mytitle
    function mytitle($title) {
        $title = 'This is a demo.';
        return $title;
    }
?>

上面这些代码就会把wp_title()函数的返回值$title改为“This is a demo.”,调用wp_title()函数得到的输出就是“This is a demo.”了,不管在什么页面调用都是如此。把这段代码添加到主题的functions.php文件中,你就能看到效果了(如果你的主题使用了wp_title函数)。

通过本文的介绍,相信大家都明白了什么是过滤器以及过滤器的用法。

官方参考手册:

http://codex.wordpress.org/Function_Reference/apply_filters

http://codex.wordpress.org/Function_Reference/add_filter

http://codex.wordpress.org/Plugin_API

https://codex.wordpress.org/Plugin_API/Hooks_2.0.x 动作钩子与过滤器钩子参考

The post WordPress过滤器(Filters)机制介绍 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/wordpress-filters-action.html/rss/ 0
SEO之网站结构优化https://www.glenlau.cn/seo-website-structure-optimization.html https://www.glenlau.cn/seo-website-structure-optimization.html#comments Wed, 09 Nov 2016 05:55:59 +0000 https://www.glenlau.cn/?p=462

  网站结构是什么? 什么样的网站结构对搜索引擎更加友好? 网站结构的优化要注意那些方面? 对于网站结构的优化 […]

The post SEO之网站结构优化 appeared first on glenlau刘国良的博客.

]]>

  网站结构是什么? 什么样的网站结构对搜索引擎更加友好? 网站结构的优化要注意那些方面? 对于网站结构的优化,我相信刚入行的站长确实是一知半解,因此本篇文章主要给站长朋友分享一下关于网站结构优化的经验之谈。

 一、网站结构到底是什么?
  从广义上讲网站结构主要包括网站的物理结构和逻辑结构;从狭义的概念来说就是网站的目录结构和内链结构,因为涉及到网站结构的优化,在这里主要从目录结构和内链结构来阐述。
  目录结构通俗来讲就是网站的URL结构,在服务器上搭建网站的时候,站长会发现服务器的根目录下一般都会有一个WWW的文件夹,这个不是一定的,但是大部分的命名都是如此,然后按照网站的规划和内容布局会有一级一级的目录基于WWW来构建,而每一个目录下面都会有具体的网页文件,比如:html、shtml、aspx、php等,这种目录路径的搭建就形成了用户访问的URL地址,从另一个方面说URL地址就是文件存储在服务器上的目录路径;这样说即使对于刚入门的站长来说也是非常容易理解。
  内链结构通俗上讲就是网站页面与页面之间的关系,建设网站的站长都知道,一张页面上除了核心内容,尤其是网站的首页、栏目页或者列表页都会很多的链接组成,而这些页面的链接就形成了整个网站的内链结构。至于什么形式内内链结构更加合理,对搜索更加友好,在接下来会一一分享给站长朋友。

  二、什么样的网站结构对搜索引擎友好?
  同样在这一块分开来讲,以便于站长能够更加清晰的认知网站结构如何去围绕搜索引擎来部署。
  前面提到目录结构的概念,基于根目录扩散成一个个实实在在存在的文件,清晰的目录路径不仅有利于站长来管理,对于搜索引擎来说也是非常的友好,通过爬取轨迹一级级获取它要抓取的页面,如果你的网站仅仅有一个首页、若干个栏目页、可扩展的专题页和文章详情页,那么理想化的URL结构就是按照服务器上实实在在的文件存储位置来构建。但是往往一个网站并不是如此简单的情况,网站多少会有一些功能性的产品要与用户做交互,要通过动态程序去构建很多的页面,以丰富网站的产品体验,所以你会发现好多网站的URL里面会有很多的动态参数,因为这些页面都是通过一定的技术批量生成的页面,并不是在服务器里面实实在在存在的页面,而官方声明搜索引擎恰恰更喜欢静态化的页面,这个时候就需要对URL地址进行包装重构,不管是Apache、Ngnix或者IIS都对URL地址有重写模块,这些暂时不做介绍,这里只介绍重写成什么样的URL地址才更有利于搜索引擎的抓取,主要包含以下两个个方面:
  1、URL地址命名要贴近目标页面的主题名称,有利于提升与目标页面的相关性,从而提升目标页面权重;
  2、URL地址的层级基于所属的类目越小越好,层级越小可以告诉搜索引擎文件存在的目录深度越小,越容易被抓取,因为只有重要的页面才会放到与根目录最近的位置,搜索引擎也会认为这些文件是网站里面相对来说比较重要的页面,优先抓取。
  内链结构主要反映的是页面之间的关系,和目录结构类似,被放到首页的链接地址往往更容易被搜素引擎抓取,这里涉及到一个链接深度的概念。搜索从发现你的网站到开始抓取页面,一般都是从首页开始进行的,如果你是一个新站的话,可以从日志里面查询到。也就是说离首页越近的网址越容易被抓取到,这里同样搜索引擎会认为链接深度越小的页面,在网站里面的重要性越大,和目录结构一致,链接深度越小的页面权重也会越大,被索引的几率也会越大。总而言之内链结构对搜索引擎的友好度主要从以下几个方面去做:
  1、从首页开始要包含网站中最重要的业务板块,一般来说都是个频道栏目页和专题的聚合;
  2、栏目、专题页面要包含它们归类下最新的内容模块和热门模块,同时要有返回上一次层级的面包屑;
  3、详情页面做为核心内容页面同样也要有相关推荐板块,以及同归属栏目下热门推荐板块,当然面包屑也是必须要有,在这里要特别强调一下合理的使用标签可以增强文章与文章的关系,更有利于搜索引擎的爬取,关于标签“迷路的小爬虫”会专门用一篇文章来告诉站长如何去布局使用。
  基本上只要你按照以上的方式去优化你的网站结构,相信你的网站在数据上面的良好体现也会稳步提升。

  三、网站结构优化注意事项
  在这里“迷路的小爬虫”也是要总结以下几点来说明过度的优化网站结构可能会出现被K的风险,总结主要由以下几点:
  1、为了减少链接深度,首页和频道页堆砌上千条链接地址,这种情况对于前期网站权重不是很高的前提下基本上会被k的体无完肤;
  2、索引标签的大量使用,在网站没有一定规模的文章或者其他的资源做支撑的前提下,慎重使用标签聚合站内资源,因为大量的添加索引标签可能会造成网站很多重复的页面和空页面,结果被k也是不可避免的;
  3、详情页面勉强的增加推荐板块,造成整个页面繁杂冗余,也是不可取的,详情页本来权重在整个网站体系里面最低,再增加如此多链接,只会被降权,即使收录也不会有好的排名;
  4、为了减少目录深度,所有的页面全部堆砌到二级目录,这种做法也是不可取的,如果整个网站除了首页全部是二级目录,也就没有主次之分,目录深度影响权重这条规则也就不可取了。

  以上四点是“迷路的小爬虫”认为比较重要的几项因素,也是很多站长会拿捏不好的几个地方,所以单独做为一项拿出来重点强调,希望站长朋友不要再犯这样的错误。

  看了这篇文章我相信大部分站长对网站结构已经有了一个初步的了解,在网站优化的过程当中也会有针对性的去偏向优化。至于很多站长所说的网站结构最好是树状结构或者比较理想的网状结构之类,只要你按照“迷路的小爬虫”所述的网站结构优化要点去做,你就会搭建成一个树状甚至网状化结构的网站。

The post SEO之网站结构优化 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/seo-website-structure-optimization.html/rss/ 1
WordPress条件判断标签及用法大全https://www.glenlau.cn/wordpress-conditional-judgment.html https://www.glenlau.cn/wordpress-conditional-judgment.html#respond Wed, 19 Oct 2016 08:06:26 +0000 https://www.glenlau.cn/?p=454

在wordpress主题和插件开发中,条件判断标签(Conditional Tags)是非常重要的,通过条件判 […]

The post WordPress条件判断标签及用法大全 appeared first on glenlau刘国良的博客.

]]>

在wordpress主题和插件开发中,条件判断标签(Conditional Tags)是非常重要的,通过条件判断标签,我们可以判断各种情况,从而使用对应的代码等。例如在顶部导航条中有一个“首页”选项,在首页的时候需要设置成高亮,我们可以在头部导航模板文件(header.php)中使用条件判断标签 is_home() 来判断当前页面是不是首页,然后再输出高亮的class。

这类的条件判断标签一般会返回一个布尔值,这样我们就可以使用 if 语句判断不同的页面不同的情况而分别使用不同的代码。
所有的条件判断标签都会判断某个条件是否成立,然后返回 True 或者 False 。此外有些条件判断标签还可以使用一些参数进一步的判断,下面是所有的 WordPress 条件判断标签:

主页面(Main)
is_home()
判断当前页面是否是博客主页面。主页面通常是显示博客内容列表的首页,但是如果你在“后台”->“设置”->“阅读”中设置了静态首页和文章索引页面的话,当访问文章索引页面是返回 True。

首页(Front)
is_front_page()
判断当前页面是否是博客首页。首页和上面的主页面不同,首页可以是文章索引页面,也可以是你在“后台”->“设置”->“阅读”中设置的静态首页。

后台控制面板(Administration Panels)
is_admin() //判断当前页面是否是后台的控制面板(Dashboard)。

文章页面(Single Post)
is_single()
判断当前页面是否是一篇文章或者是附件页面或者自定义文章类型页面。注意,WordPress 中文章(Single)和页面(Page)是不同的概念。这个条件判断标签可以附加参数。
实例:

is_single( ’17’ )  //判断当前文章是否是 id 为 17 的文章。
is_single( ‘Irish Stew’ )  //判断当前文章的标题是否是 “Irish Stew”。
is_single( ‘beef-stew’ )   //判断当前文章的别名(Slug)是否为 “beef-stew”。
is_single( array( 17, ‘beef-stew’, ‘Irish Stew’ ) )  //传递多个参数需要使用数组。上面条件判断标签判断满足 id 为 17 、别名为 beef-stew、标题为 Irish Stew 任意一个条件文章被访问时返回 True。
is_single( array( 17, 19, 1, 11 ) )  //判断多个文章的 id,用法同上。
is_single( array( ‘beef-stew’, ‘pea-soup’, ‘chili’ ) )  //判断多个文章的别名,用法同上。
is_single( array( ‘Beef Stew’, ‘Pea Soup’, ‘Chili’ ) )  //判断多个文章的标题,用法同上。

注意:这个函数对于传递的参数,并无法很明确的判断参数究竟是 id、文章标题或者是文章别名,如果参数为 17,当 id 为 17 的文章会返回 True,当 Slug 为 17 的文章也会返回 True。

置顶文章(Sticky Post)
is_sticky()
WordPress 带有置顶文章的功能,使用这个标签判断是否为置顶文章,需要传递一个参数(通常为文章 id,用法同上)。如果不想传递参数,需要用在主循环(Loop)中,由主循环提供。通常的用法是在主循环输出文章索引列表的时候,使用 is_sticky() 判断当前文章是否为置顶文章,然后在置顶文章的 title 前面输出 “[置顶]” 之类的标志。

文章类型(Post Type)
get_post_type()
严格意义上,这并不是一个条件判断标签,它会返回当前文章注册的文章类型,并且可以通过类似 if ( ‘book’ == get_post_type() ) … 来实现判断文章类型的功能。

is_singular()
判断是否满足 is_single、is_page 和 is_attachment 的任意一个条件,满足返回 True。可以测试所有的文章类型。

post_type_exists()
判断某个文章类型是否被注册了,需要传递一个文章类型参数。它并不是测试某文章是否属于某个文章类型。

is_post_type_hierarchical( $post_type )
如果 $post_type 在注册的时候设置了支持层次( hierarchical support )返回 True。例如:is_post_type_hierarchical( ‘book’ ) 。

is_post_type_archive()
判断是否在任何的自定义文章类型存档页面(post type archive)。

is_post_type_archive( $post_type )
判断是否在 $post_type 中符合条件的文章类型存档页面,$post_type 可以是一个单一的文章类型或者是一个文章类型数组。提示:如果想要应用文章类型存档功能,需要在注册文章类型的时候,将 has_archive 参数设置为 True。

评论相关(Comments)
is_comments_popup()
判断是否在评论弹出框的窗口中。

comments_open()
判断评论功能是否开启,必须用在主循环中。

pings_open()
判断文章 ping 功能是否开启,必须用在主循环中。

判断页面(Page)
WordPress 中内置的有两种内容形式,一种是文章(Post)另一种是页面(Page),这里要判断的是页面,而不是指你网站的某个网页。
实例:

is_page()  //判断当前页面是否为“页面”。
is_page( 42 )  //判断当前页面是否是一个 ID 为 42 的页面。
is_page( ‘About Me And Joe’ )  //判断当前页面是否是一个标题为 “About Me And Joe” 的页面。
is_page( ‘about-me’ )  //判断当前页面是否是一个别名为 “about-me” 的页面。
is_page( array( 42, ‘about-me’, ‘Aout Me And Joe’ ) )  //一次包含多种情况的判断,需要使用数组传递,用法同上。

判断内容分页
在文章和页面中,有时候内容很多,在文章中插入标签可以将内容分隔开分成不同的页面,并通过对应的函数获取分页的列表。下面的例子,可以判断当前是在第几个页面中,这样你就可以在某个页面中输出一些特别的信息(例如在第一个页面中,输出一个提示)。

例子1:

$paged = $wp_query->get( ‘page’ );
if ( ! $paged || $paged < 2 ) {  
   // 这里是不带有分页或者是带有分页页面的第一页 
} else { 
   // 这里是带有分页的其他页面。 
} 

例子2:

$paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : false; 
if ( $paged === false ) { 
   // 这里是不带有分页或者是带有分页页面的第一页 
} else { 
  // 这里是带有分页的其他页面。 
} 

判断子页面(sub-Pages) WordPress 中的页面(page)是有父子级关系的,判断是否为子页面时,没有内置 is_subpage() 这样的函数,但是你可以使用下面的方法来判断。
方法1:

global $post; // 下面代码需要用在主循环中,如果你在循环外使用,需要声明全局变量 
$post if ( is_page() && $post->post_parent ) {
    // 这是一个子页面
} else {
    // 这不是一个子页面
}

建议将下面的方法2加入你的 functions.php 文件中,下面的 is_subpage() 函数的原理与方法1类似,但是可以返回当前页面父页面的 ID 或者是 false。

方法2:

function is_subpage() {
  global $post; // 获取页面的相关信息
  if ( is_page() && $post->post_parent ) { // 判断是否有父页面
     return $post->post_parent; // 如果有返回父页面的 ID
  } else {
     return false; // 如果没有返回 false
  }
}

如果你经常需要判断子页面,强烈建议使用方法2。
如果需要判断父页面是否为某个特定的页面,可以使用方法3的代码。方法3代码会判断的更加详细,从而更加便于自定义和个性化(例如加一些图片)。

方法3:

if ( is_page( ‘about’ ) || ‘2’ == $post->post_parent ) {
  // 这个页面是“about”页面,或者它的父页面是“about”
  $bannerimg = ‘about.jpg’;
} elseif ( is_page( ‘learning’ ) || ’56’ == $post->post_parent ) {
  $bannerimg = ‘teaching.jpg’;
} elseif ( is_page( ‘admissions’ ) || ’15’ == $post->post_parent ) {
  $bannerimg = ‘admissions.jpg’;
} else {
  $bannerimg = ‘home.jpg’; // 如果都不满足的话,就用这个图片
}

方法4是一个函数可以让你更容易的实现判断,只需要传递参数即可,如果正在访问对应页面,将会返回 True。
方法4:

function is_tree( $pid ) { // $pid = 传递的 ID 参数是我们希望判断的页面 ID
  global $post;

  if ( is_page($pid) )
    return true; // 当前正在这个页面,所以返回 True

  $anc = get_post_ancestors( $post->ID );
  foreach ( $anc as $ancestor ) {
    if( is_page() && $ancestor == $pid ) {
      return true;
    }
  }
  return false; // 没有在当前页面,并且这个页面没有子页面
}

可以将这个函数添加进 functions.php 中,调用 is_tree( ‘id’ ) 就可以判断当前页面是否是指定页面或者是这个页面的子页面。相比较方法3 is_tree( ‘2’ ) 的功能和 is_page( ‘about’ ) || ‘2’ == $post->post_parent 是一样的。

注意,如果页面乘此多于一级,那么父级页面指的是上一层页面,不是这个页面层次关系最顶层的页面。

判断页面模版(Page Template)
判断当前页面是否由某个页面模版生成的

is_page_template() //判断是否使用了一个页面模版。
is_page_template( ‘about.php’ )  //判断应用的页面模版是否是 “about” 这个模板。注意,这个参数与其他参数不同,如果你想判断是否是由某个页面模版声称的,你需要将那个页面模版的文件名填上去,包括后面的 .php 后缀。

判断分类页面(Category)

is_category()  //判断当前页面是否为分类目录或者存档(archive)页面。
is_category( ‘9’ )  //判断当前分类页面的 ID 是否为 9。
is_category( ‘Stinky Cheeses’ )  //判断当前分类页面的名字是否为“Stinky Cheeses”。
is_category( ‘blue-cheese’ )  //判断当前分类页面的别名是否为“blue-cheese”。
is_category( array( 9, ‘blue-cheese’, ‘Stinky cheeses’ ) )  //同上,你懂的。
in_category( ‘5’ )  //判断当前文章是否属于某个特定分类目录(id 为 5),返回 True。注意,这里是 in 而不是 is,与上面的不同。
in_category( array( 1,2,3 ) )  //判断当前文章是否属于某些特定的分类目录。

判断标签页面(Tag)

is_tag()  //判断当前页面是否为标签页面。
is_tag( ‘mild’ )  //判断当前标签页面的别名是否为 “mild”。
is_tag( array( ‘sharp’, ‘mild’, ‘extreme’ ) )   //判断当前标签页面的别名是否是 “sharp”、“mild”或者“extreme”中的某个。
has_tag()  //判断当前文章是否有一个标签,必须用在主循环中。
has_tag( ‘mild’ )  //判断当前文章是否有标签 “mild”。
has_tag( array( ‘sharp’, ‘mild’, ‘extreme’ ) )   //判断当前文章是否有数组里的那些标签。

判断自定义分类页面(Taxonomy)
自定义分类页面并非是上面的 category 那种分类页面,而是指 WordPress 分类系统页面。在 WordPress 默认内置了两种分类系统:category 和 tag,同时支持开发者自定义分类系统。

is_tax()  //判断当前页面是否为一个分类系统的存档页面。
is_tax( ‘flavor’ )  //判断当前页面是否为一个名为 flavor 自定义分类的存档页面。
is_tax( ‘flavor’, ‘mild’ )  //判断当前自定义分类 flavor 页面的别名是否为 mild。
is_tax( ‘flavor’, array( ‘sharp’, ‘mild’, ‘extreme’ ) )  //判断当前自定义分类 flavor 页面的页面是否为 sharp、mild、extreme 中的一个。
has_term()  //判断当前页面是否带有自定义分类。
has_term( ‘green’, ‘color’ )  //判断当前页面是否是否带有别名为 green 的自定义分类 color。
has_term( array( ‘green’, ‘orange’, ‘blue’ ), ‘color’ )  //判断当前页面是否是否带有数组中的自定义分类 color。

判断作者页面(Author)

is_author()  //判断当前页面是否是一个作者存档页面。
is_author( ‘4’ )  //判断当前页面是否为 id 为 4 的作者页面。
is_author( ‘Vivian’ )   //判断当前存档页面是否是 Vivian(Nickname) 的作者存档页面。
is_author( array( 4, ‘john-jones’, ‘Vivian’ ) )  //判断当前存档页面是否属于 id 为 4,或者名字为 “john-jones”、“Vivian” 的作者存档页面。

is_multi_author()
判断当前博客是否有超过一个作者发表过文章。WordPress 3.2 以上版本可用。

判断是否为日期存档页面(Date Page)

is_date()  //判断当前页面是否为任何的按时间存档的页面。
is_year()  //判断当前页面是否为按年份存档的页面。
is_month()  //判断当前页面是否为按月份存档的页面。
is_day()   //判断当前页面是否为按日期存档的页面。
is_time()  //判断当前页面是否为按照小时、分钟、秒存档的页面。
is_new_day()  //判断当前页面是否为文章日期的新的一天,必须用在主循环中。

判断任意存档页面(Any Archive Page)
is_archive()
判断当前页面是否为一个存档页面,包括:分类、标签、作者页面、日期存档页面等。

判断搜索结果页面(Search Result Page)
is_search()
判断当前页面是否为一个搜索结果页面。

判断是否为 404 页面(404 Not Found Page)
is_404()
判断当前页面是否带有 “HTTP 404:Not Found” 错误。

判断被分页页面(Paged Page)
is_paged()
这里的分页指的是存档页面,如果一个日志或者静态页面的内容通过通过拆分成多个页面,这些不能算为 paged page

判断是否为附件页面(Attachment)
is_attachment()
判断当前页面是否为一个附件页面。附件页面通常为一个图片或者是一些其他文件,可以在编辑文章上传文件那里进行设置。

判断单页面、文章页面或者附件页面
is_singular()
只要 is_single()、is_page()、is_attachment() 返回 True,此函数返回 True。

is_singular( ‘book’ )  //判断当前文章是否属于自定义文章类型(Custom Post Types)“book”。
is_singular( array( ‘newspaper’, ‘book’ ) )  //判断当前文章是否属于数组中某个自定义文章类型。

判断订阅页面
is_feed()
判断是否在订阅输出的页面。这个判断标签是为插件开发者提供的。

判断引用通告(Trackback)
is_trackback()
判断当前 WordPress 主题是否开启了 Trackback 功能。这个判断标签是为开发者提供的。

判断预览页面
is_preview()
判断一篇文章是否在预览(文章本身处于草稿状态)。

判断是否有摘要
has_excerpt()
判断当前文章是否有摘要内容。

has_excerpt( 42 )  //判断文章 ID 为 42 的文章是否有摘要内容。

还可以使用下面代码来实现:

// 先获取全局变量 $post
global $post;
if ( emptyempty( $post->post_excerpt ) ) {
  // 如果文章没有摘要执行这块代码
} else {
  // 如果文章带有摘要执行这块代码
}

如果你想在文章没有摘要的时候,显示空内容:

if ( ! has_excerpt() ) {
  echo ”;
} else {
  the_excerpt();
}

判断是否有可用的自定义导航菜单
has_nav_menu()
判断一个被注册过的自定义导航菜单是否被指定了一个菜单。

判断是否在主循环中
in_the_loop()
判断是否在主循环内部。对开发者来说很有用。

判断边栏是否已经激活可用
is_active_sidebar()
判断给出的边栏是否激活(正在使用)。如果边栏(用 name、id、number 标志)正在使用,就会返回 True。

判断是否是网站的一部分(对于多站点网站)
is_multisite()
判断当前的站点是否是 WordPress MultiSite 的一部分。

判断是否是主站点(对于多站点网站)
is_main_site()
判断当前站点在整个网络中,是否是主站点。

判断网站的 Admin (对于多站点网站)
is_super_admin()
判断当前用户是否是整个网站中的管理员。

判断插件是否激活
is_plugin_active()
判断某个插件是否激活正在使用。

判断子主题
is_child_theme()
判断当前是否是一个正在使用的子主题。

判断当前主题功能
current_theme_supports()
判断当前主题的功能特性是否存在。

使用条件判断标签的实例
下面给出一些例子,让你明白上面的判断标签如何使用。
文章中的条件判断,下面的例子讲述了当用户访问一篇文章的时候如何使用 is_single() 来显示一些特殊的内容。

if ( is_single() ) {
echo ‘This is just one of many fabulous entries in the ‘ . single_cat_title() . ‘ category!’;
}

下面的例子介绍了如何在主循环中使用条件判断语句。功能是在首页(index)中显示文章的摘要,而在文章(single)和主页(home)中显示文章的正文内容。

if ( is_home() || is_single() ) {
  the_content();
}
else {
  the_excerpt();
}

同时使用多个条件判断标签

使用常见的 PHP 操作符 就可以使用多个条件判断标签。

// 同时判断两个条件
if ( is_single() || is_page() ) ) {
  // 如果当前是一篇文章或者一个页面,就执行这块代码
}

if ( is_archive() && ! is_category( ‘nachos’ ) ) {
  // 如果当前是一个分类的存档页面(除了 nachos 分类),就执行这块代码
}
// 同时判断三个条件
if ( $query->is_main_query() && is_post_type_archive( ‘products’ ) && ! is_admin() ) {
  // 如果当前是 main query 并且是 products 自定义文章类型的存档页面
  // 同时没有用 admin 账号登陆后台,就执行这块代码
}

if ( is_post_type_archive( ‘movies’ ) || is_tax( ‘genre’ ) || is_tax( ‘actor’ ) ) {
  // 如果当前是 Movies 的自定义文章类型存档
  // 或者是 genre 分类存档页面
  // 或者是 actor 分类存档页面,就执行这块代码
} 

The post WordPress条件判断标签及用法大全 appeared first on glenlau刘国良的博客.

]]> https://www.glenlau.cn/wordpress-conditional-judgment.html/rss/ 0 如何自定义WordPress中的短代码https://www.glenlau.cn/wordpress-shortcode.html https://www.glenlau.cn/wordpress-shortcode.html#respond Tue, 16 Aug 2016 07:59:53 +0000 https://www.glenlau.cn/?p=441

在wordpress系统中,短代码可以被无数次的重复使用,这大大提升了代码的复用性,只需要写一个方法,就可以在 […]

The post 如何自定义WordPress中的短代码 appeared first on glenlau刘国良的博客.

]]>

在wordpress系统中,短代码可以被无数次的重复使用,这大大提升了代码的复用性,只需要写一个方法,就可以在多处运行,非常的方便和实用,今天就介绍下这wordpress中如何定义自己的短代码。

WordPress短代码的使用非常简单。比如说我们想显示给定的最新文章,我们可以使用类似下面的代码:
[new-posts]

再进一步的,我们可以通过设定一个参数来控制现实的文章的数量:
[new-posts posts=”5″]

同样的,我们还可以为文章列表增加一个标题:
[new-posts posts=”5″]The post title[/new-posts]

接下来我们尝试下自己创建一个短代码,步骤大致如下:

  1. 创建一个函数,当 WordPress 发现短代码的时候会调用此函数;
  2. 通过设置一个唯一的名称来注册短代码;
  3. 把注册的函数绑定到Wordpress的action上。

第一步:创建回调函数;
当wordpress发现短代码的时候,它会被一个称作回调函数的一段代码所代替,所以我们先创建一个函数,从数据库中获取最新的文章,贴上代码:

function new_posts_function() {
	query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => 1));
	if (have_posts()){
	     while (have_posts()){
                the_post();
                $return_string = '<a href="'.get_permalink().'">'.get_the_title().'</a>';
	     }
	}
	wp_reset_query();
	return $return_string;
}

以上函数我们查询数据库,获取最新的文章信息,并返回一个带有链接的字符串。

第二步:注册短代码;
我们现在把第一步的函数注册到Wordpress系统中,这个函数是一个短代码,代码如下:

function register_shortcodes(){
	add_shortcode('new-posts', 'new_posts_function');
}

使用wordpress勾子(Hook into WordPress),将我们的函数在文章展现的时候被调用,代码如下:
add_action( ‘init’, ‘register_shortcodes’);

第三步:实际应用;
做好上面的步骤后,接下来我们就可以在文章中直接使用我们自己的短代码了;调用方式如下:
[new-posts]

到此,一个简单的短代码就已经完成了。

接下来我们再深入些,创建带参数的短代码;短代码非常灵活,因为它允许我们添加参数以使它们具有更多的功能。假定我们需要显示一定数量的最新文章。为了实现这个,我们需要给短代码增加额外的选择来指定显示最新的多少篇文章。

我们需要使用两个函数,第一个是Wordpress内置的 shortcode_atts() 函数,它把用户的短代码属性与本地属性结合在一起,并填充到所需要的位置。第二个是PHP的 extract() 函数,顾名思义,它提取短代码的各个属性。

扩展我们的回调函数,我们添加一个参数,它是一个数组,从中我们可以提取到我们需要获取的文章的数量。我们查询数据库,获取指定数量的文章,并返回一个列表:

function new_posts_function($atts){
	extract(shortcode_atts(array(
		'posts' => 1,
	), $atts));
 
	$return_string = '<ul>';
	query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));
	if (have_posts()) :
		while (have_posts()) : the_post();
			$return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
		endwhile;
	endif;
	$return_string .= '</ul>';
 
	wp_reset_query();
	return $return_string;
}

如果用户不指定该选项,1将是默认值。我们可以添加更多的属性,使短代码接受更多的参数。用这个增强的函数,我们可以指定调用最新文章的数量:
[new-posts posts=”5″]

在浏览器中显示时,你将看到最新的五篇文章列表;
wordpress-shortcode-2

接下来我们再往短代码中添加内容:
我们可以更进一步扩展我们的短代码,添加一些内容作为参数来传递,这将是最新文章列表的标题。为了实现此功能,我们需要在回调函数中增加第二个参数 $content ,并把它显示在列表前面的一个标签中。新的函数如下:

function new_posts_function($atts, $content = null) {
	extract(shortcode_atts(array(
		'posts' => 1,
	), $atts));
 
	$return_string = '<h3>'.$content.'</h3>';
	$return_string .= '<ul>';
	query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));
	if (have_posts()) :
		while (have_posts()) : the_post();
			$return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
		endwhile;
	endif;
	$return_string .= '</ul>';
 
	wp_reset_query();
	return $return_string;
}

这种短代码类似于一个HTML标签:
[new-posts posts=”5″]This is the list heading[/new-posts]
除了文章列表多了一个标题,其余的内容和上一个示例是一样的:
wordpress-shortcode-3

wordpress默认情况下,侧边栏小工具是忽略短代码的,那么我们如果想在小工具中也使用我们自己的短代码应该怎么做呢?我们可以通过一行代码来启用这个函数,为了使侧边栏小工具支持短代码,添加如下的代码:
add_filter(‘widget_text’, ‘do_shortcode’);

同样的,在评论中启用短代码:
add_filter( ‘comment_text’, ‘do_shortcode’ );

以及在摘要中启用短代码:
add_filter( ‘the_excerpt’, ‘do_shortcode’);

The post 如何自定义WordPress中的短代码 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/wordpress-shortcode.html/rss/ 0
如何加载高效的脚本与样式到WordPresshttps://www.glenlau.cn/wp-enqueue-script-style.html https://www.glenlau.cn/wp-enqueue-script-style.html#respond Fri, 12 Aug 2016 07:41:13 +0000 https://www.glenlau.cn/?p=418

在进行开发 WordPress 主题或插件时会经常需要加载一些 JavaScript 来实现某些特殊功能,或添 […]

The post 如何加载高效的脚本与样式到WordPress appeared first on glenlau刘国良的博客.

]]>

在进行开发 WordPress 主题或插件时会经常需要加载一些 JavaScript 来实现某些特殊功能,或添加一些CSS样式表美化UI;Wordpress为了最大限度地保各证 JavaScript 脚本的兼容性,不至于出现 JavaScript 失效的情况,所以一般在页头加载 JavaScript 文件。

我们一般不建议直接去修改主题的 header.php,或者添加代码到 wp_head()wp_footer() 钩子上,而是将代码添加到 function.php 中使用 WordPress 官方文档建议使用的 WP 内建的 wp_enqueue_script()wp_enqueue_style() 等函数进行操作。

wordpress

函数:wp_enqueue_script()

使用方法:

参数分解:

  • $handle:用于区别 JS 名称,即标识字串 (string);
  • $src:JS 的文件 URL (string);
  • $deps:加载的 JS 所依存的其他 JS 标识字串数组 (array:string, 非必需);
  • $ver:JS 的版本号,留空则使用当前 WP 版本号 (string, 非必需);
  • $in_footer:是否放置到网页 HTML 底部加载 (boolean, 非必需)。

函数:wp_enqueue_style()

使用方法:

参数分解:

  • $handle:用于区别 CSS 的名称,即标识字串 (string);
  • $src:CSS 的文件 URL (string);
  • $deps:加载的 CSS 所依存的其他 CSS 标识字串数组 (array:string, 非必需);
  • $ver:CSS 文件的版本号,留空则使用当前 WP 版本号 (string, 非必需);
  • $media:用于加载 CSS 的头部标签 link 的 media 参数值 (string, 非必需)。

示例:


在以往我们制作 WP 主题的时候,当引入 JS 文件或 CSS 文件时,通常是直接编辑 header.php 文件,然后将相应的页面头部 HTML 代码添加进去。或者利用 wp_head() 函数钩子插入 HTML 代码。

遇到一个插件或主题功能比较多的 WordPres 网站时,如果仍使用自行插入代码的方式引入 JS / CSS,将可能导致 JS 的重载和 CSS 的重定义或覆盖的后果。而使用 wp_enqueue_script()wp_enqueue_style() 等函数操作头部引用,将输出 HTML 语句的工作交给 WP 内核去完成(几乎所有插件都这么做),不仅能够避免重复加载的现象出现,也可实现按 PHP 脚本顺序,任意修改、覆盖、删除即将被加载的 JS 文件和 CSS 文件。

相关函数:

函数:wp_register_script()

wp_register_script 用于注册一个脚本文件(JS文件)并将返回值的句柄提供给函数 wp_enqueue_script() 使用。

使用方法:

参数分解:

  • $handle:
    (string) (必须) 脚本名称. 名称必须唯一在之后函数 wp_enqueue_script() 会使用到该名称.
    Default: None
  • $src:
    (string) (必须) 脚本路径,可以使用绝对路径。
    Default: None
  • $deps:
    (array) (可选) 脚本依赖包,依赖包会在脚本加载之前预先加载。
    Default: array()
  • $ver:
    (string) (可选)脚本版本控制。
    Default: false
  • $in_footer:
    (boolean) (可选) 定义脚本的位置,如果为true脚本会在页面底部加载,默认在head头部加载。
    Default: false

应用实例
使用下面的方式,脚本被会自己的加载:

// 使用下面的方式进行脚本的注册及入队
add_action('wp_enqueue_scripts', 'enqueue_and_register_my_scripts');
 
function enqueue_and_register_my_scripts() {
    // 注册脚本
    wp_register_script('my_plugin', plugins_url('my-plugin/js/my_script.js'));
    // 只在特定页面使用该脚本
    if (is_page('careers')) {
        // 需要使用脚本依赖于上面注册的脚本及jQuery,则
        wp_enqueue_script('my-careers-script', plugins_url('my-pluing/js/my_careers_script.js', array('jquery', 'my_plugin'));
    }
}

The post 如何加载高效的脚本与样式到WordPress appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/wp-enqueue-script-style.html/rss/ 0
用Canvas做的一个时钟https://www.glenlau.cn/canvas-clock.html https://www.glenlau.cn/canvas-clock.html#respond Wed, 10 Aug 2016 06:25:18 +0000 https://www.glenlau.cn/?p=394

这两天在看HTML5的标签,看到 Canvas 标签,非常的强大,可以绘制各种图形,只要你想得到都能画。 于是 […]

The post 用Canvas做的一个时钟 appeared first on glenlau刘国良的博客.

]]>

这两天在看HTML5的标签,看到 Canvas 标签,非常的强大,可以绘制各种图形,只要你想得到都能画。 于是乎就是想着自己做一个网页上的时钟,一可以练习熟悉下Canvas 标签,何乐不为呢,说干就干。

我们先看下最终效果:

Your browser does not support canvas

由于对Canvas标签不了解,我参考了国外的一个帖子,现在一步一步的来做;

先下载一个背景图片,这里我帖上一张;
Clock_Face_2_by_AGF82

创建一个这样的HTML文档



   Canvas Clock

 
   
    Your browser does not support canvas
    

上面代码包括一个canvas 标签和脚本标签,里面并没有实质的内容。接下来我们开始写脚本代码;我们要先把背景图片添加到canvas中去,我们先初始化canvas,并定义一个图像对像.代码如下,

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

var clockImage = new Image();
clockImage.src = 'images/Clock_Face_2_by_AGF82.png';

创建一个方法,把图像添加到Canvas中去,并给程序添加一个入口,代码:

function addBackgroundImage(){
   context.drawImage(clockImage, 0,0,canvas.width, canvas.height);
} 

function createClock(){
   addBackgroundImage();
} 

function createClock(){
  addBackgroundImage();
}

function clockApp(){
  if(!clockImageLoaded){
    setTimeout('clockApp()', 100);
    return;
  }
  createClock();
}

clockApp();

接下来我们创建一个画表针的方法,见代码:

function drawHourHand(){

}

我们来练习下,先在Canvas中画一条直线,见代码:

   context.strokeStyle = 'red';
   context.beginPath();
   context.moveTo(100,10);
   context.lineTo(100,150);
   context.stroke();

知道怎么使用Canvas中画画线,我们现在尝试着画个表针

function drawHand(size){
   context.beginPath();
   context.moveTo(0,0); // center
   context.lineTo(-4, -10);
   context.lineTo(0, size * -1);
   context.lineTo(4,-10);
   context.lineTo(0,0);
   context.fill();
}

越写越罗嗦了,我还是帖上完整的代码,代码中有注释,非常好理解,^_^ ,完整代码如下:





canvas clock

 




 
  Your browser does not support canvas
  
Canvas

另外提供一个漂亮的带闹钟的时钟源码,有兴趣的可以研究下。效果见下图:
带闹钟的时钟

源码下载: https://pan.baidu.com/s/1nvaXNF7 密码: kg8w

The post 用Canvas做的一个时钟 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/canvas-clock.html/rss/ 0
Java语言中接口和抽象类区别https://www.glenlau.cn/java-abstract-class-interface.html https://www.glenlau.cn/java-abstract-class-interface.html#respond Tue, 26 Jul 2016 09:31:47 +0000 https://www.glenlau.cn/?p=352

1.概述: 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的 […]

The post Java语言中接口和抽象类区别 appeared first on glenlau刘国良的博客.

]]>

1.概述:

一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了。当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 。

说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象类了,这也是本文我想说的重点。

既然面向对象设计的重点在于抽象,那Java接口和Java抽象类就有它存在的必然性了。

Java接口(interface)和Java抽象类(abstract class)代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序 的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些有用的抽象类型作为你结构层次上的顶层。

Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。

  1. Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以(就是interface中只能定义方法,而不能有方法的实现,而在abstract class中则可以既有方法的具体实现,又有没有具体实现的抽象方法),这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点这个在我的另外一篇博客mapreduce 新旧API 区别中有提到类似的问题,在新的mapreduce api中更倾向于使用抽象类,而不是接口,因为这更容易扩展。原因就是上面划线部分所说的。
  2. 一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。(使用抽象类,那么继承这个抽象类的子类类型就比较单一,因为子类只能单继承抽象类;而子类能够同时实现多个接口,因为类型就比较多。接口和抽象类都可以定义对象,但是只能用他们的具体实现类来进行实例化。)
  3. 从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
  4. 结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍然由Java接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract+接口名。(A extends AbstractB implements interfaceC,那么A即可以选择实现(@Override)接口interfaceC中的方法,也可以选择不实现;A即可以选择实现(@Override)抽象类AbstractB中的方法,也可以选择不实现)

Java接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。Java抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。

使用Java接口和抽象Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。而不要用具体Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。

2.实例

下面给出一个具体的接口Action,代码如下所示:

package org.springframework.webflow.execution;  
    public interface Action {  
        public Event execute(RequestContext context) throws Exception;  
    }  

在这个接口中,定义了一个没有具体实现的方法,方法名叫做execute(),返回类型是Event。如前面第一条所述,接口中的方法都是没有实现的。这些方法的具体实现是在实现(implements)这个接口的类中给出的。

再来看一个实现Action接口的抽象类AbstractAction,代码如下。

    package org.springframework.webflow.action;  
      
    import org.apache.commons.logging.Log;  
    import org.apache.commons.logging.LogFactory;  
    import org.springframework.beans.factory.BeanInitializationException;  
    import org.springframework.beans.factory.InitializingBean;  
    import org.springframework.util.ClassUtils;  
    import org.springframework.webflow.core.collection.AttributeMap;  
    import org.springframework.webflow.execution.Action;  
    import org.springframework.webflow.execution.Event;  
    import org.springframework.webflow.execution.RequestContext;  
      
    public abstract class AbstractAction implements Action, InitializingBean {  
      
        protected final Log logger = LogFactory.getLog(getClass());  
      
        public EventFactorySupport getEventFactorySupport() {  
            return new EventFactorySupport();  
        }  
      
        public void afterPropertiesSet() throws Exception {  
            try {  
                initAction();  
            } catch (Exception ex) {  
                throw new BeanInitializationException("Initialization of this Action failed: " + ex.getMessage(), ex);  
            }  
        }  
      
        protected void initAction() throws Exception {  
        }  
      
        protected Event success() {  
            return getEventFactorySupport().success(this);  
        }  
      
        protected Event success(Object result) {  
            return getEventFactorySupport().success(this, result);  
        }  
      
        protected Event error() {  
            return getEventFactorySupport().error(this);  
        }  
      
        protected Event error(Exception e) {  
            return getEventFactorySupport().error(this, e);  
        }  
      
        protected Event yes() {  
            return getEventFactorySupport().yes(this);  
        }  
      
        protected Event no() {  
            return getEventFactorySupport().no(this);  
        }  
      
        protected Event result(boolean booleanResult) {  
            return getEventFactorySupport().event(this, booleanResult);  
        }  
      
        protected Event result(String eventId) {  
            return getEventFactorySupport().event(this, eventId);  
        }  
      
        protected Event result(String eventId, AttributeMap resultAttributes) {  
            return getEventFactorySupport().event(this, eventId, resultAttributes);  
        }  
      
        protected Event result(String eventId, String resultAttributeName, Object resultAttributeValue) {  
            return getEventFactorySupport().event(this, eventId, resultAttributeName, resultAttributeValue);  
        }  
      
        public final Event execute(RequestContext context) throws Exception {  
            Event result = doPreExecute(context);  
            if (result == null) {  
                result = doExecute(context);  
                doPostExecute(context);  
            } else {  
                if (logger.isInfoEnabled()) {  
                    logger.info("Action execution disallowed; pre-execution result is '" + result.getId() + "'");  
                }  
            }  
            return result;  
        }  
      
        protected String getActionNameForLogging() {  
            return ClassUtils.getShortName(getClass());  
        }  
      
        protected Event doPreExecute(RequestContext context) throws Exception {  
            return null;  
        }  
      
        //抽象方法  
        protected abstract Event doExecute(RequestContext context) throws Exception;  
      
        protected void doPostExecute(RequestContext context) throws Exception {  
        }  
    }  

在抽象类AbstractAction中,既有具体实现的方法,又有没有具体实现的抽象方法

    //抽象方法  
    protected abstract Event doExecute(RequestContext context) throws Exception;  

需要注意的是在抽象类中,如果方法没有具体实现(就是方法后面没有{}),那么必须加上abstract来声明这个方法,而接口中不需要使用abstract来声明(抽象类之所以被称为抽象类,就是因为它包含有抽象方法。含有抽象方法的类叫做抽象类)。

The post Java语言中接口和抽象类区别 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/java-abstract-class-interface.html/rss/ 0
响应式设计 CSS3 Media Queries 介绍https://www.glenlau.cn/css3-media-queries.html https://www.glenlau.cn/css3-media-queries.html#respond Thu, 12 May 2016 03:03:11 +0000 https://www.glenlau.cn/?p=253

  网站的响应式设计,好处在于不同的设备访问可实现不同的展示效果;在 CSS2 中,你可以为不同的媒介设备(如 […]

The post 响应式设计 CSS3 Media Queries 介绍 appeared first on glenlau刘国良的博客.

]]>

  网站的响应式设计,好处在于不同的设备访问可实现不同的展示效果;在 CSS2 中,你可以为不同的媒介设备(如屏幕、打印机)指定专用的样式表,而现在借助 CSS3 的 Media Queries 特性,可以更为有效的实现这个功能。你可以为媒介类型添加某些条件,检测设备并采用不同的样式表。

  例如,你可以把用于大屏幕上显示的样式和用于移动设备的专用样式放在一个样式文档中,这样,在不改变文档内容的情况下,不同的设备可以呈现不同的界面外观。阅读这篇文章学习 CSS3 Media Queries 的基本功能和国外使用 CSS3 的 Media Queries 特性的优秀网站案例。

CSS3 Media Queries

Max Width

下面的样式会在可视区域的宽度小于 600px 的时候被应用。

@media screen and (max-width: 600px) {
  .class {
    background: #ccc;
  }
}

如果你想链接到一个单独的样式表,把下面的代码放在标签里。

<link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css" />

Min Width

下面的样式会在可视区域的宽度大于 900px 的时候被应用。

@media screen and (min-width: 900px) {
  .class {
    background: #666;
  }
}

Multiple Media Queries

你还可以使用过个匹配条件,下面的样式会在可视区域的宽度在 600px 和 900px 之间的时候被应用。

@media screen and (min-width: 600px) and (max-width: 900px) {
  .class {
    background: #333;
  }
}

Device Width

下面的样式会在 max-device-width 是 480px 的设备上触发。(提示:max-device-width 是设备的实际分辨率,而 max-width 指的是可视区域分辨率。)

@media screen and (max-device-width: 480px) {
  .class {
    background: #000;
  }
}

For iPhone 4

下面的样式是为 iPhone 4 专门写的 (作者: Thomas Maier)。

<link rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio: 2)" type="text/css" href="iphone4.css" />

For iPad

你还可以使用 media query 在 iPad 上检测方向(portrait or landscapse) (作者: Cloud Four)。

<link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css">
<link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css"> 

Media Queries for IE

遗憾是的,IE8 及更老版本的浏览器不支持 CSS3 Media Queries,不过可以使用 Javascript 弥补,下面是一些解决方案:

CSS Tricks – using jQuery to detect browser size
The Man in Blue – using Javascript
jQuery Media Queries Plugin

附:CSS3 Media Queries 浏览器兼容性表
CSS3 Media Queries 浏览器兼容性表

CSS3 Media Queries 应用案例

需要在下面这些支持 Media Queries 特性的浏览器中浏览:IE9+, Firefox, Chrome 和 Safari。浏览每个站点,看页面布局是如何响应浏览器窗口变化的。

Hicksdesign

大尺寸: 3 列侧栏
较小尺寸: 2 列表侧栏 (中间一列下降到左边的列)
更小尺寸: 1 列侧栏 (右列上移到标志下方)
最小尺寸: 没有侧栏 (LOGO及右列上移,其他侧边栏列移到底部)
Hicksdesign

Colly

页面的布局会根据浏览器的尺寸在1列,2列和4列之间切换。
Colly

A List Apart

大尺寸: 导航在顶部,图片只有一行。
中等尺寸: 导航在左边,图片变成3列。
小尺寸: 导航在顶部,LOGO没有了背景图片,图片变成3列。
A List Apart

Tee Gallery

这个和前面的 Colly 很像,不过这个案例中的图片也会随着布局的变化而变化。技巧是使用百分比设置元素的宽度。
Tee Gallery
总结

  请记住:为移动设备优化了样式表并不意味着你的网站就适合在移动设备显示了。要做到真正的移动设备优化,要削减图像大小、标签数量和加载的资源尺寸等等。CSS3 Media Queries 是用于设计的呈现,而不是优化。

【参考文章】

* 《What are CSS Media Querie》

* 《WebDesignWall:CSS3 Media Queries》

* 《Can I use CSS3 Media Queries?》

The post 响应式设计 CSS3 Media Queries 介绍 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/css3-media-queries.html/rss/ 0
WordPress 获取各种URL和URl的函数合集https://www.glenlau.cn/wordpress-url.html https://www.glenlau.cn/wordpress-url.html#comments Fri, 27 Mar 2015 08:47:22 +0000 https://www.glenlau.cn/?p=243 wordpress url

wordpress中的路径也不是很负责,有人为了让wordpress运行速度更快,就直接写了绝对地址,其实这样 […]

The post WordPress 获取各种URL和URl的函数合集 appeared first on glenlau刘国良的博客.

]]>
wordpress url

wordpress中的路径也不是很负责,有人为了让wordpress运行速度更快,就直接写了绝对地址,其实这样是很不好的,有可能别人修改了wordpress程序的地址,那么这样你编写的这个插件或者是主题就只有你自己用,别人无法使用,这样做得不偿失,为了避免错误,了解WordPress中与获取路径相关的函数很重要。

以下均假设WordPress站点安装在https://www.glenlau.cn下。

站点路径相关函数

home_url()

返回站点路径,相当于后台设置->常规中的”站点地址(URL)”。

$url = home_url();
echo $url;
//输出: https://www.glenlau.cn
$url = home_url(‘/images/’);
echo $url;
//输出:https://www.glenlau.cn/images/

site_url()

如果WordPress安装在域名根目录下,则该函数与home_url()相同。

如果WordPress安装在子目录下,例如https://www.glenlau.cn/,则site_url()返回WordPress实际安装地址,相当于后台->设置->常规中的“WordPress 地址(URL)”。

$url = site_url();
echo $url;
//假设WordPress安装在https://www.glenlau.cn下
//输出:https://www.glenlau.cn

admin_url()

返回后台地址,传递参数后也可返回后台menu的地址

$url = admin_url();
echo $url;
//输出:https://www.glenlau.cn/wp-admin/

content_url()

返回实际的inc目录,如果是默认安装,且装在根目录下,则如下所示

$url = content_url();
echo $url;
//输出:https://www.glenlau.cn/inc

如果在wp-config.php中改变了inc目录的位置,则该函数会返回正确地址,例如wp-config.php中如下定义

define('WP_CONTENT_DIR','/home/user/public_html/cdn');
define('WP_CONTENT_URL','http://sola-cdn.me');

则content_url()的返回值为

http://sola-cdn.me

includes_url()

返回当前WordPress站点存放核心文件的目录other的地址,可以带一个$path作为参数。

$url = includes_url( '/js/');
echo $url;
//输出:https://www.glenlau.cn/other/js/

wp_upload_dir()

返回WordPress上传目录的地址,是一个数组,包含一系列与上传地址相关的信息。

<?php $upload_dir = wp_upload_dir(); ?>

提供如下信息给你

  • ‘path’ – 上传目录的服务器绝对路径,通常以反斜杠(/)开头
  • ‘url’ – 上传目录的完整URL
  • ‘subdir’ – 子目录名称,通常是以年/月形式组织的目录地址,例如/2012/07
  • ‘basedir’ – 上传目录的服务器绝对路径,不包含子目录
  • ‘baseurl’ – 上传目录的完整URL,不包含子目录
  • ‘error’ – 报错信息.

例如

$upload_dir = wp_upload_dir();
echo $upload_dir['baseurl'];
//输出:https://www.glenlau.cn/file

主题路径相关函数

get_theme_root_uri()

获取存放主题的目录URI

echo get_theme_root_uri();
//输出:https://www.glenlau.cn/inc/themes

get_theme_root()

获取存放主题的目录的服务器绝对路径

echo get_theme_root();
//输出:<tt>/home/user/public_html/inc/themes</tt>

get_theme_roots()

获取主题目录的目录名称,如果你的主题目录是/inc/themes,则

echo get_theme_roots();
//输出:/themes

get_stylesheet_directory()

获取当前启用的主题目录的服务器绝对路径,例如

/home/user/public_html/inc/themes/twentyeleven

可以用来include文件,例如

<?phpinclude( get_stylesheet_directory() . ‘/includes/myfile.php’); ?>

get_stylesheet_directory_uri()

获取当前启用的主题目录的URI,例如

echo get_stylesheet_directory_uri();
//输出:https://www.glenlau.cn/inc/themes/twentyeleven

可以使用在需要主题目录URI的场合,例如图片

<img src="<?php echo get_stylesheet_directory_uri() ?>/images/aternus.png" alt="" title="" width="" height="" />

get_template_directory_uri()

如果当前启用的主题是一个child theme,该函数返回parent theme的主题目录URI,用法与get_stylesheet_directory_uri()类似。

get_template_directory()

如果当前启用的主题是一个child theme,该函数返回parent theme的主题目录的服务器绝对路径,用法与get_stylesheet_directory()类似。

get_template()

获取当前启用主题的主题目录名称,例如现在启用的主题为twentyeleven,则

echo get_stylesheet();
//输出:twentyeleven

get_stylesheet()

获取当前启用主题的主题目录名称,与get_template()的区别是,如果用了child theme,则返回child theme的目录名称。
插件路径相关函数

plugins_url()

获取当前插件的目录的URI,例如一个插件位于/ext/myplugin下,该目录下放有插件的主文件名为myplugin.php,在myplugin.php中执行下面的代码,结果如下

echo plugins_url();
//输出:https://www.glenlau.cn/ext

echo plugins_url('',__FILE__);
//输出:https://www.glenlau.cn/ext/myplugin

echo plugins_url('js/myscript.js',__FILE__);
//输出:https://www.glenlau.cn/ext/myplugin/js/myscript.js

plugin_dir_url()

返回当前插件的目录URI,例如

echo plugin_dir_url(__FILE__ );
//输出:https://www.glenlau.cn/ext/myplugin/

注意结尾有反斜杠。

plugin_dir_path()

返回当前插件目录的服务器绝对路径,例如

echo plugin_dir_path(__FILE__ );
//输出:/home/user/public_html/ext/myplugin/

可以用来引用文件,例如

<?php
define('MYPLUGINNAME_PATH', plugin_dir_path(__FILE__) );
require MYPLUGINNAME_PATH . 'includes/class-metabox.php';
require MYPLUGINNAME_PATH . 'includes/class-widget.php';
?>

plugin_basename()

返回调用该函数的插件文件名称(包含插件路径)

例如在插件myplugin下的myplugin.php文件中调用该函数,结果如下

echo plugin_basename(__FILE__);
//输出:myplugin/myplugin.php

如果在myplugin/include/test.php文件中调用(test.php通过include引用到myplugin.php中),结果如下

echo plugin_basename(__FILE__);
//输出:myplugin/include/test.php

路径相关常量

WordPress中还有一组用define定义的常量代表路径。

WP_CONTENT_DIR

inc目录的服务器绝对路径,例如

/home/user/public_html/inc

WP_CONTENT_URL

inc目录的URI地址,例如

https://www.glenlau.cn/inc

WP_PLUGIN_DIR

插件目录的服务器绝对路径,例如

/home/user/public_html/ext

WP_PLUGIN_URL

插件目录的URI地址,例如

https://www.glenlau.cn/ext

TEMPLATEPATH

当前启用主题目录的服务器绝对路径,相当于get_template_directory()例如

/home/user/public_html/inc/themes/twentyeleven

STYLESHEETPATH

当前启用主题目录的服务器绝对路径,相当于get_stylesheet_directory(),与TEMPLATEPATH的区别在于如果使用child theme,该常量指向child theme目录。

本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创和谐网络环境。
转载请注明:文章转载自:问说网 » wordpress各种获取路径和URl地址的函数总结
本文标题:wordpress各种获取路径和URl地址的函数总结
本文地址:https://www.glenlau.cn/wordpress-url.html

The post WordPress 获取各种URL和URl的函数合集 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/wordpress-url.html/rss/ 10
seo优化之–最佳关键词选择https://www.glenlau.cn/seo-keyword.html https://www.glenlau.cn/seo-keyword.html#respond Thu, 12 Feb 2015 07:08:36 +0000 https://www.glenlau.cn/?p=233

搜索引擎优化(SearchEngine Optimization,简称:SEO),指为了从搜索引擎中获得更多的 […]

The post seo优化之–最佳关键词选择 appeared first on glenlau刘国良的博客.

]]>

搜索引擎优化(SearchEngine Optimization,简称:SEO),指为了从搜索引擎中获得更多的免费流量,从网站结构、内容建设方案、用户互动传播等角度进行合理规划,使网站更适合搜索引擎的检索原则的行为。

由于搜索引擎的知识面非常广泛,探讨点也非常之多,比如从开始的网站建设、域名空间的选择、网站的布局、程序代码的优化、站内优化、外部链接的建设、网站数据的分析。这里就不一一分析探讨,今天主要讨论下影响网站排名的因素——关键词的选择。

如何选择关键词是一个老生常谈的话题了。这也正是做seo的第一步,也是最核心的一部。关键词选择对了让你事半功倍,选择错误,所做的努力都将付之东流。如何正确选择呢?我们一起来分析一下:

一、目标关键词

能突出核心的体现出网站所要表达的主题的关键词,网站的主要内容围绕这些关键词展开,可以为网站带来高质量的定向流量。用户往往对网站的产品和服务有需求,或者对网站的内容感兴趣。所有网站的目标关键词一般是网站产品和服务,也是目标客户可能用来搜索的关键词。

目标关键词也就是我们的核心关键词,用来定义网站是提供什么产品、什么服务的,搜索引擎会通过综合分析给你网站定义是否符合这个关键词,不是说你网站标题或者内容里面放置某个关键词就可以获得排名,这是不一定,特别是竞争度大的关键词。核心关键词是为你网站定制方向和内容的更新策略,所以在确定前必须要重点进行分析,针对关键词、用户、行业。

举个栗子
搜索排名结果
上图中出现的“pogopin”这个关键词就是该网站的产品,也是这个网站的目标关键词之一。

二、长尾关键词

网站上非目标关键词但也可以带来搜索流量的关键词,称为长尾关键词。长尾关键词的特征是比较长,往往是2-3个词组成,甚至是短语,存在于内容页面,除了内容页的标题,还存在于内容中。搜索量非常少,并且不稳定。长尾关键词带来的客户,转化为网站产品客户的概率比目标关键词高很多。存在大量长尾关键词的大中型网站,其带来的总流量非常大。长尾关键词基本属性是:可延伸性,针对性强,范围广。

一个具有一定规模的网站,从搜索带来流量的关键词90%都是长尾关键词,因为长尾词的数量是海量的,每个用户的思维、基础不一样,导致搜索的词也是不一样,所以在优化过程中我们需要重点的对用户的搜索行为进行分析,找出更多的关键词进行布局到我们的网站,获得更多的用户受众。

再举个栗子
长尾巴词
像上图片搜索的“什么手机电池连接器最好”就是一个长尾关键词

三、时效性关键词

时效性关键词是有周期性的,当互联网出现一个热点事件或者是节日性关键词,我们把这类关键词叫做时效性关键词。

热点时效词:这类关键词是伴随着事件,我们需要去查找和我们网站相关的时效词,不是所有的热点话题都可以进行更新到我们的网站,内容必须相关这是更新的前提,只有相关更新的内容才会对用户有帮助。

节日性时效词:这类是具有周期性,都是以年为一个周期,需要分析你的网站是否也具有这类关键词的性质,例如:情人节送什么礼物好、父亲节礼物、春节购物等,都是和节日相关的。如果这类词与我们网站有相关性,我们就需要在节日来前1-2个月去优化这类词,因为关键词排名是需要时间积累。

季节性时效词:和生活相关的网站,都具备这类关键词,春季、夏季、秋季、冬季。最具代表性的行业就是服装类,针对不同的季节都会有新款的服装、款式销售。这类词的优化也必须根据每年用户的需求来进行,有可能去年的热销产品今年就不流行。提前1-2个月进行优化。

看看这个栗子
关键字的时效性
上图的就是在百度热搜索话题,但随着时间的推移新的热点一来,旧的变慢慢的淡却。

四、品牌关键词

网站的品牌关键词名称一般来说是我们公司的名称或者产品品牌的名称。网站的品牌关键词就像人的名字一样,都是具备一定的唯一性。一般来说,搜索品牌词来到你的网站的基本上都是老客户,这样一部分的转化率是非常高的,也能促进你的网站排名。

一个网站的品牌词类似我们先下的公司名称,当一个网站在行业里面具备一定的品牌性,这将对网站的排名,用户信任度都会得到很大的提升,在等同排名权重下,品牌性的网站排名得到优先展现,用户也更加的喜欢点击有品牌的网站,就像我们在购买产品,喜欢购买品牌产品。

网站的品牌词是独一无二,想要具有品牌性就必须在开始建站就必须规划好,怎么去建立网站的品牌,可以通过品牌推广、品牌广告、软文等。

一样来个栗子
品牌关键词
像上面的“拓普联科”就是公司名称,如果你公司名字在行业中非常的响亮,那么它也是一个不错的关键词。

五、关键词的挖掘
在网站优化的过程中挖掘关键词是非常重要的一步,一些大型网站甚至安排专业的人做关键词的挖掘。也只有我们把关键词进行挖掘出来的时候才能够进行下一步的选择。

挖掘关键词的时候是非常有必要借助一些有用的工具,下面LZ介绍几个非常好用的关键词挖掘工具。

1、百度下拉框、相关搜索
最好的关键词选择还是通过百度自身去寻找最好的,这里的词一般就是我们寻找出来去做的主关键词。
百度相关搜索

2、百度推广助手
百度推广客户端是一款可供百度搜索推广与网盟推广用户免费使用的账户管理软件,同时也是一款免费的软件,对于SEO来说是挖掘关键词的利器。
百度推广助手

3、金花追词关键词工具
这款工具也是效果非常不错,能够快速帮你把你的行业的所有关键词全部挖掘,这个是第三方的软件,也是多方位的挖掘工具。

六、关键词的选择
网站关键词的选择是非常重要的一步,方向不对努力白费。主关键词的选择是尤为重要的。通过上面的几种方法挖掘,我们已经有了大量的关键词,这些关键词我们要从中挑选几个出来,要注意以下几点:
1、关键词要和自己的网站的主题相关
如果关键词跟网站主题都不相关的话,就算最后网站排名做上去也是没有价值,无法形成转化率。所以你选的关键词一定要与网站的主体密切相关。

所选择的关键词也必须有用户进出搜索,这样你针对关键词所写的文章,建立的页面才是有用户受众,这样才会给网站带来价值。

2、选择指数比较多、竞争小的关键词
最有效率的关键词就是那些竞争网页最小,同时被用户搜索次数最多的词。有的关键词很可能竞争的网页很多,使得成本效益最低,要花很多钱、很多精力才能排在前面,但实际在搜索这个词的人并不是很多。应该做详细的调查,列出综合这两者之后效果最好的关键词。

3、关键词的范围与业务
很多人在刚刚做seo的时候都想要做关键词过于宽泛,过于大的关键词,比如:“租车”,他定位就是租车这个关键词。这个用宽泛的关键词,竞争力度非常大,同时也有可能跟你的业务不相关,就算你的网站把这类关键词排名做上去了,搜索这类词的用户的目的很不明确,转化率不会太高。用户不可能在北京跑到杭州来租车。所以在选择关键词的时候更加要具体、细分化。

4、参考竞争对手的网站
很多企业公司的产品业务都是大同小异,当我们很难通过自己挖掘的所有关键词选择出自己核心的关键词,那么参考竞争对手的关键词也是非常有利于你的关键词选择的。

通过竞争对手的分析,可以找出用户非常有需求的内容,但是竞争对手都没有进行特供或者是不符合用户的体验,我们就可以针对这个点来进行用户的针对性满足,获得这部分用户。

5、用户搜索习惯
一个网上卖鲜花的网站,众所周知,鲜花经常被当做表达情意或庆贺的礼品送人,所以,除了提交跟鲜花、花店相关的关键词外,还可以提交跟节庆和送礼相关的关键词。比如:礼品、生日礼物、生日礼仪。网民并不都是某行业中的专家,所以有些专业名称的关键词是不大会搜索的,比如:“圣诞节用花”,你当然可以提交“圣诞节用花”,但可能很久都没有人搜索这个关键词,建议你提交“圣诞节”。如果你查询“圣诞节”的相关关键词,就会发现搜索关键词“圣诞节礼物”、“圣诞节礼品”、“圣诞节送的花”、“圣诞节装饰”、“圣诞节设计”的网民也可能需要鲜花,即成为你的潜在用户,这些都是用户想要的信息。做seo久了很容易局限自己的思维,那么你可以问问你身边的朋友。

七、关键词的筛选与拓展
当我们通过以上的方式挖掘到了需要的关键词,这个时候针对不需要的关键词筛选删除,针对现有需要的关键词进行拓展,丰富自己的关键词词库。以上我们也提到了通过百度相关搜索、下拉框、推广助手、金花工具等方式可以找到各种关键词,把以上的关键词拿出来开业运用一下几种方式拓展。

1、季节 比如:拿服装来说,春天如何选购服装、夏天选购服装的注意事项
2、性别 比如:拿减肥来说,男性吃什么能够减肥、女性吃什么快速瘦身
3、地区 比如:拿搬家来说,北京搬家、杭州搬家、温州搬家
4、职业 比如:拿肺炎来说,老师如何预防肺炎、白领治疗肺炎的注意事项
5、用途 比如:拿净水器来说,家用净水器、商用净水器、别墅净水器
6、节日 比如:拿礼物来说,七夕送女朋友什么礼物、圣诞哪些礼物最受欢迎
7、型号 比如:拿笔记本来说,华硕A4D笔记本、华硕W2JC笔记本
8、功能 比如:拿手机来说,智能手机、照相手机、3G手机、4G手机
9、疑问 比如:哪里、如何、多少钱、怎样 这些都是带有疑问的词能够进行组合
以上几种方法是我们经常进行使用的,还可以参加其他搜索引擎的相关搜索、下拉框、自己网站的后台统计用户搜索的词等等,都是我们在挖掘关键词中经常用到的方法。

对于自己行业的关键词大量的挖掘是需要花费大量的时间和精力。通过对于自己网站整体宏观的把控,这个时候我们的一个网站词库就已经建立起来了,接下来的时间就是对于网站数据的分析和关键词的再次筛选。

1、当网站后期有了流量之后,我们就可以通过百度统计、百度商桥等工具看到后台有哪些关键词能够带来流量和转化率。一般我们分析的数据有:通过什么关键词进来网站、哪些关键词有咨询量、哪些关键词不咨询、哪些关键词能够成交、以及关键词跟单成功的比例。这些数据都能够做成一份表格,方便我们知道哪些关键词是有用,哪些关键词是没用。
2、基本上在网站的中后期我们很多时间都是花在关键词统计这方面,根据自己网站的流量来进行衡量时间(一般半个月时间),把无用的关键词进行放弃,从网站的词库中删除。

关键词的操作就是一个循环:关键词挖掘→ 筛选→ 拓展→ 实践→ 再次筛选,依次进行不断的循环到最后留下的全是这个行业转化率最高的关键词。

八、建立网站关键词库
对于一个关键词库,这是每个网站都必须建立的,在网站前期就应该规划好,这样在我们后期才知道有多少关键词已经优化,网站关键词的覆盖率。
那我们应该怎么来进行建立关键词库呢?下面LZ提供一个建立词库的步骤:

第一:关键词的挖掘
通过上面的关键词挖掘,把所有和网站相关性的词进行收集起来,通过多个渠道,也可以开始收集一部分,在后期优化的过程中对词库进行扩充。
第二:关键词分类
对收集的所有关键词进行放入excel表格里面,进行分类,根据行业的不同,关键词的分类也是不同的,有按照产品的型号、产品价格、用户的习惯、时间、季节、问答等,把收集的关键词进行放入对应的分类里面,需要过滤掉相同的关键词。
第三:词库的维护
当对某个关键词进行了优化可以在后面带上对应页面的URL,这是我们在做内容的依据,并且对新找的关键词添加进词库,删除部分价值不大的。
第四:覆盖率判断
根据你网站以优化的关键词和词库的总关键词进行对比,发现网站优化的进度,优化的情况。根据网站的运营情况做出相应的调整,把关键词的覆盖率尽量的大。

关键词库对于我们网站优化的指导意义是非常之大,不管是评估网站的内容还是优化的进度都是非常的有价值,对于网站现在已经对多少关键词进行优化,哪类内容是用户最为需求的,可以进行分析跟踪。

The post seo优化之–最佳关键词选择 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/seo-keyword.html/rss/ 0
Windows系统命令 shutdown 详解https://www.glenlau.cn/windes-shutdown.html https://www.glenlau.cn/windes-shutdown.html#comments Mon, 29 Dec 2014 01:47:56 +0000 https://www.glenlau.cn/?p=187

先介绍下系统自带的关机指令,很多人应该已经知道了,就是shutdown,不带参数执行将会列出它的参数,常用参数 […]

The post Windows系统命令 shutdown 详解 appeared first on glenlau刘国良的博客.

]]>

先介绍下系统自带的关机指令,很多人应该已经知道了,就是shutdown,不带参数执行将会列出它的参数,常用参数为:
/s 关闭计算机
/r 关闭并重启动计算机
/f 强制正在运行的应用程序关闭而不事先警告用户
/t xxx 设置关闭前的超时为 xxx 秒。
有效范围是 0-600,默认为 30
另外,在倒计时过程输入 shutdown /a 可以取消关机或重启,不加/t参数执行则倒计时30秒。
一般需要立即关机可以这样写:(将/s参数换成/r参数就是立即重启)
shutdown /f /s /t 0
shutdown支持对远程计算机进行操作,需要使用/m参数,如:
shutdown /f /s /m \\\\test
在30秒后强制将局域网中名为test的计算机关闭
再说下at指令,它的作用是计划在指定时间和日期在计算机上运行命令和程序。在命令行下输入at /?将列出它的帮助信息,在“帮助和支持中心”里有更详细的解释及示例。
假设想实现晚上23:30自动关机,可以这么写:
at 23:30 shutdown /f /s /t 0
成功的话会有类似这样的信息回应:新加了一项作业,其作业 ID = 1
要取消这个定时关机的话,有两种方法
方法一、命令行
不带任何参数执行at,将会列出已经设定的内容,记下状态ID号,比如本例为1,然后输入:
at 1 /delete
也可以简写为:
at 1 /d
不加序列号使用/d参数将会删除所有设定的内容,如果想不经确认删除所有设定的内容,可用:at /d /y
方法二、任务计划
用at指令设定的定时执行指令可在“控制面板”的“任务计划”中看到,要取消的话删除就行了。
如果你只是临时用用,比如只是当天需要定时自动关机,用上述指令就行了。如果需要在一个月中的某几天或每周一甚至是每天执行,就需要再加点参数,仍然举例说明。
例1、每月的1、5、10、15、20号的0点自动关机
at 00:00 /every:1,5,10,15,20 shutdown /f /s /t 0
例2:每周一的23:00自动关机
at 23:00 /every:Monday shutdown /f /s /t 0
例3:每天22:00自动关机
at 22:00 /every:Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday shutdown /f /s /t 0
即使用every参数,例3中的每天自动关机可以简写为:
at 22:00 /every:Su,M,T,W,Th,F,Sa shutdown /f /s /t 0
最后解释一下本贴标题为何要注明XP/2003,Windows 2000是不自带shutdown指令的(当然从XP/2003系统里复制一个过去也能用),我的机器上也没装Windows 2000,不知道在2000里是否自带at指令。
另,用at指令而不是在任务计划里添加是因为用at指令添加的任务是以系统最高的SYSTEM权限来执行的,不登录也会生效,而在任务计划里添加的任务需要指定管理员帐号密码才能做到不登录也生效,at指令还能用\\\\computername指定在局域网里的其它计算机上建立自动执行的任务计划,当然前提条件是你有对方机器的管理员帐号和密码。
补充二点:
1、用以上命令,并命令执行时,系统进入关机倒计时。这时,如果正在工作,不需要关机,那马上在倒计时设置时间内运行“shutdown.exe -a”中止关机命令。也可以建立一个这个命令的快捷方式在桌面上,方便使用。
2、拷贝Shutdown.exe到2000系统下AT命令完全可以使用,包括Win2000、Win2000Server。
用at配合shutdown命令非常方便。
比如要在晚上22:00关机,可以使用at 22:00 shutdown -s -f
附ShutDown用法及参数

用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m \computername] [-t xx] [-c “comment”] [-d up:xx:yy]
没有参数 显示此消息(与 ? 相同)
-i 显示 GUI 界面,必须是第一个选项
-l 注销(不能与选项 -m 一起使用)
-s 关闭此计算机
-r 关闭并重启动此计算机
-a 放弃系统关机
-m \computername 远程计算机关机/重启动/放弃
-t xx 设置关闭的超时为 xx 秒
-c “comment” 关闭注释(最大 127 个字符)
-f 强制运行的应用程序关闭而没有警告
-d [u][p]:xx:yy 关闭原因代码
u 是用户代码
p 是一个计划的关闭代码
xx 是一个主要原因代码(小于 256 的正整数)
yy 是一个次要原因代码(小于 65536 的正整数)
-f:强行关闭应用程序
-m \计算机名:控制远程计算机
-i:显示图形用户界面,但必须是Shutdown的第一个选项
-l:注销当前用户
-r:关机并重启
-t时间:设置关机倒计时
-c “消息内容”:输入关机对话框中的消息内容(不能超127个字符
2、举例:
关闭计算机 shutdown –s (方法:”开始”->”运行”->”shutdown -s”->”确定”)
延迟3秒关闭计算机 shutdown –s –t 3(方法:”开始”->”运行”->”shutdown –s –t 3”->”确定”)
取消关闭计算机 shutdown –a (方法:”开始”->”运行”->”shutdown –a”->”确定”)
3、应用:
(1)您如果想在1小时后自动关闭计算机,比如:您正在下载一个软件或一部电影,而您有急事要去丽水,您会怎么办?停止下载?太可惜了!继续?下载完后电脑怎么关闭?不用愁!您可以使用该命令解决:
shutdown –s –t 3600 (系统在3600秒后关闭计算机,时间自定)
您就放心地去丽水了,而不用担心您的计算机长期开着了。
(2)出现RPC漏洞而导致倒计时自动关机,使用该命令取消倒计时自动关机:
shutdown –a (方法:”开始”->”运行”->”shutdown –a”->”确定”)
前一段时间的网络病毒非常猖獗,如震荡波、冲击波等就是针对WindowsXP的RPC(远程过程调用)漏洞设计的,它导致系统倒计时自动关机,很多同学、老师头痛不已。如下图:
(3)利用Shutdown命令 实现网络统一关机
笔者所在单位下班后常有很多老师不关电脑,领导发现后要求解决这个问题。我想如果到各办公室去查看,这很费时,于是就想能否通过一台电脑把所有的机器都关掉。因为所有的办公用机安装的都是Windows XP系统,就想到了使用远程关机“Shutdown”命令。具体方法如下:
步骤1 单击“开始→运行”,在对话框中输入“Gpedit.msc”,单击[确定],打开“组策略编辑器”。
步骤2 在“组策略编辑器”窗口的左边打开“计算机配置→Windows设置→安全设置→本地策略→用户权利指派”,在右边的窗口选择“从远端系统强制关机”。在弹出的对话框中显示目前只有“Administrators”组的成员才有权远程关机;单击对话框下方的[添加用户或组]按钮,然后在弹出的对话框中输入 “Heyongsheng”(管理员账号),再单击[确定]。
步骤3 这时在“从远端系统强制关机”的属性中便添加了一个“Heyongsheng”用户,单击[确定],最后关闭“组策略编辑器”窗口。
对各办公室的电脑进行上述操作后,我们便给每台计算机的“Heyongsheng”用户授予了远程关机的权限。到下班时,我只要在自己的机器上进行以下操作:
步骤4单击“开始→运行”,在对话框中输入“Shutdown -I”,屏幕上将显示“远程关机”对话框(图1)。
图1 远程关机控制窗口
(4)用XP的ShutDown.exe实现服务器定时重启
Windows XP的关机是由Shutdown.exe程序来控制的,位于WindowsSystem32文件夹中。如果想让Windows 2000也实现同样的效果,可以把Shutdown.exe复制到系统目录System32下。
首先当然要求主板必须支持软件关机功能,否则你还得亲自去按电源开关才能关机,现在的主板一般都支持软件关机。操作步骤:单击“开始”/程序/附件/系统工具中”计划任务”,弹出计划任务窗口,然后双击”添加已计划的任务”,运行“计划任务向导”,按“浏览”,找到WINDOWS目录中的 Rundll32.exe 文件,单击”打开”按钮,在出现的对话框中键入该任务的名字(如”定时关机”),执行方式选择“每天” ,然后按“下一步”选择定时关机时间(可以先试一下比现在机器上显示的时间晚1分钟),下一步选中“当单击完成打开该任务的高级属性”,单击”完成”,最后右击”定时关机”来打开属性,在运行栏输入“C:WINNTsystem32shutdown.exe -r -t 1”,单击”确定”不久,OK了。
4.结论:WindowsXP中的shutdown命令功能很强大,你可以去尝试使用,挖掘出功能,为我们服务。创建个快截方式 地址里输入 shutdown -t -s 3600
然后把他复制到 开始 程序 启动里
或者 在 注册表的 run 项目下 加入 这个快截方式的 地址
你也可以放在boot.inf里的lood 语句中
还可以用批 处理
vbs 文件
用vbs文件的好处是可以后台运行控制时间不向你的破语句
输入shutdown -a 就OK!

The post Windows系统命令 shutdown 详解 appeared first on glenlau刘国良的博客.

]]>
https://www.glenlau.cn/windes-shutdown.html/rss/ 1