移动搜索SEO分享:PHP自动生成百度开放适配及360移动适配专用的Sitemap文件
导读
随着智能手机的高速普及,人们将更多时间放到了手机上,麻利的做着以前只能在电脑上才能完成的购物、聊天、信息获取等事情。如此一来,站长们对移动端的 SEO 也就越来越关注。当然,也各大搜索引擎也开始发力移动搜索,比如百度近期推出的2014 网站移动化大赛和开放适配、360 推出的移动适配等。而张戈对于移动适配也是关注已久,写过不少相关文章,现在就来分享一个通过 php 自动生成百度开放适配和 360 移动适配的专用 sitemap 文件的方法。
先再次回顾下,张戈关于百度开放适配和 360 移动适配的历次折腾记录:
①、百度开放适配专用 sitemap 制作说明
②、360 站长平台移动适配文件制作说明
③、百度开放适配&360 移动适配专用 Sitemap 转换工具
④、利用 Meta 声明来做百度开放适配
必须要申明的是,下面介绍的专用适配 Sitemap,并不同于我们平常所说的网站地图 Sitemap,百度开放适配 Sitemap 里面是 PC 页—手机页的对应关系,例如:
此文的 PC 页面地址为:http://zhangge.net/3816.html
而对应移动版页面为:http://m.zhangge.net/3816.html
那么可以通过这个专用 sitemap 文件将对应关系提交到百度开放适配,一旦适配成功,百度将会在移动搜索中将原 PC 页结果替换为对应的手机页结果。具体可以参考百度官方说明文档:http://zhanzhang.baidu.com/wiki/39#3
另外,响应式网站的开放适配请前往查看张戈博客的另一篇文章:http://zhangge.net/4530.html
弄清楚概念之后,咱们继续往下看。
一、准备工作
在生成适配文件之前,你需要一个 PC 网站的手机版本。本文所提供的代码默认支持的是二级域名做移动站,想用二级域名做移动站的请查看张戈博客的相关文章:
①、完美实现移动主题在 360 网站卫士缓存全开情况下的切换
②、分享 WordPress Mobile Pack 汉化精简版及隐藏指定插件更新提示的方法
二、php 代码
①、百度开放适配:
<?php
require('./wp-blog-header.php');
header("Content-type: text/xml");
header('HTTP/1.1 200 OK');
$posts_to_show = 1000; // 获取文章数量
echo '<?xml version="1.0" encoding="UTF-8" ?>';
echo '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">';
?>
<!-- generated-on=<?php echo get_lastpostdate('blog'); ?> Diy By 张戈博客(http://zhangge.net)-->
<url>
<loc><?php echo 'http://'.$_SERVER['HTTP_HOST']; ?></loc>
<lastmod><?php $ltime = get_lastpostmodified(GMT);$ltime = gmdate('Y-m-dTH:i:s+00:00', strtotime($ltime)); echo $ltime; ?></lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
<data>
<display>
<xhtml_url><?php echo 'http://m.'.$_SERVER['HTTP_HOST']; ?></xhtml_url>
</display>
</data>
</url>
<?php
header("Content-type: text/xml");
$myposts = get_posts( "numberposts=" . $posts_to_show );
foreach( $myposts as $post ) { ?>
<url>
<loc><?php the_permalink(); ?></loc>
<lastmod><?php the_time('c') ?></lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
<data>
<display>
<xhtml_url><?php echo str_replace("zhangge.net","m.zhangge.net",the_sitemaplink()); ?></xhtml_url>
</display>
</data>
</url>
<?php } // end foreach ?>
<?php
/* 单页面 */
$mypages = get_pages();
if(count($mypages) > 0) {
foreach($mypages as $page) { ?>
<url>
<loc><?php echo get_page_link($page->ID); ?></loc>
<lastmod><?php echo str_replace(" ","T",get_page($page->ID)->post_modified); ?></lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
<data>
<display>
<xhtml_url><?php echo str_replace("zhangge.net","m.zhangge.net",get_page_link($page->ID)); ?></xhtml_url>
</display>
</data>
</url>
<?php }} /* 单页面结束 */ ?>
<?php
/* 博客分类 */
$terms = get_terms('category', 'orderby=name&hide_empty=0' );
$count = count($terms);
if($count > 0){
foreach ($terms as $term) { ?>
<url>
<loc><?php echo get_term_link($term, $term->slug); ?></loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
<data>
<display>
<xhtml_url><?php echo str_replace("zhangge.net","m.zhangge.net",get_term_link($term, $term->slug)); ?></xhtml_url>
</display>
</data>
</url>
<?php }} /* 分类结束 */?>
<?php
/* 标签(可选) */
$tags = get_terms("post_tag");
foreach ( $tags as $key => $tag ) {
$link = get_term_link( intval($tag->term_id), "post_tag" );
if ( is_wp_error( $link ) )
return false;
$tags[ $key ]->link = $link;
?>
<url>
<loc><?php echo $link; ?></loc>
<changefreq>monthly</changefreq>
<priority>0.4</priority>
<data>
<display>
<xhtml_url><?php echo str_replace("zhangge.net","m.zhangge.net",$link); ?></xhtml_url>
</display>
</data>
</url>
<?php } /* 标签结束 */ ?>
</urlset>
②、360 移动适配:
<?php
require('./wp-blog-header.php');
header("Content-type: text/txt");
header('HTTP/1.1 200 OK');
$posts_to_show = 1000; // 获取文章数量
?>
<?php echo 'http://'.$_SERVER['HTTP_HOST']; ?><?php echo "t"; ?><?php echo 'http://m.'.$_SERVER['HTTP_HOST']; ?><?php echo "n"; ?>
<?php
/* 文章页面 */
header("Content-type: text/txt");
$myposts = get_posts( "numberposts=" . $posts_to_show );
foreach( $myposts as $post ) {
the_permalink();
echo "t";
echo str_replace("zhangge.net","m.zhangge.net",the_sitemaplink());
echo "n";
}
?>
<?php
/* 单页面 */
$mypages = get_pages();
if(count($mypages) > 0) {
foreach($mypages as $page) {
echo get_page_link($page->ID);
echo "t";
echo str_replace("zhangge.net","m.zhangge.net",get_page_link($page->ID));
echo "n";
}
}
?>
<?php
/* 博客分类 */
$terms = get_terms('category', 'orderby=name&hide_empty=0' );
$count = count($terms);
if($count > 0){
foreach ($terms as $term) {
echo get_term_link($term, $term->slug);
echo "t";
echo str_replace("zhangge.net","m.zhangge.net",get_term_link($term, $term->slug));
echo "n";
}
}
?>
<?php
/* 标签(可选) */
$tags = get_terms("post_tag");
foreach ( $tags as $key => $tag ) {
$link = get_term_link( intval($tag->term_id), "post_tag" );
if ( is_wp_error( $link ) ) {
return false;
$tags[ $key ]->link = $link;
}
echo $link;
echo "t";
echo str_replace("zhangge.net","m.zhangge.net",$link);
echo "n";
}
?>
代码说明:
<1>、以上代码默认限制 1000 篇文章,如需修改请改变第 5 行的数值即可;
<2>、涉及到张戈博客域名( *.zhangge.net )的代码,请根据实际情况修改成自己网站的域名;
<3>、请网站的实际版式,修改代码中板式标签部分,即将<xhtml_url>标签替换成实际的网站版式,以下为三种网站版式,选择一种即可:
<!— html5版式 -->
<html5_url></html5_url>
<!— wml版式 -->
<wml_url></wml_url>
<!— xhtml版式(常见版式) -->
<xhtml_url></xhtml_url>
不会看版式的,请参考如下说明对比一下网站的申明:
XHTML版式申明:
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
WML版式申明:
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
HTML5版式申明:
<!DOCTYPE HTML>
如果发现你的移动站用的还是 PC 通用的版式申明,那么请改成相应的 mobile 版式申明,以加快搜索引擎的识别。
补充说明:如果是其他类型的移动站,该如何修改?
(1)、如果是 http://yoursite.com/wap 这种二级目录形式,请将代码中的m.zhangge.net全部替换成 yoursite.com/wap即可。
(2)、如果是http://yoursite.com?type=mobile 这种参数形式:
请将 2 种代码中的
<?php echo str_replace("zhangge.net","m.zhangge.net",the_sitemaplink()); ?>
修改为:
<?php the_permalink(); ?>?type=mobile
即加上你移动站对应的转换参数即可,至于代码中的首页对应关系该如何修改,相信可以自行搞定,无需赘述!
三、新增函数
请编辑主题目录下的 functions.php 文件,插入以下函数代码:
/** 开放适配相关函数 **/
function the_sitemaplink() {
return esc_url( apply_filters( 'the_permalink', get_permalink() ) );
}
做完以上步骤,你就可以手动访问 2 个 php 脚本查看效果了,比如:
http://zhangge.net/sitemap_baidu_sp.php
http://zhangge.net/sitemap_360_sp.php
若显示正常,你可以继续下一步了。
目前已收集到的报错反馈,及相应解决办法:
①、若访问报500 Internal Server Error :File xxx is writeable by group错误,请将以上 2 个文件权限设置为 644。
②、访问百度开放适配 php 地址后,大概在 16 行报出如下错误:
<b>Warning</b>
: Cannot modify header information - headers already sent by (output started at /www/web/musk100_com/public_html/sitemap_baidu_sp.php:6) in <b>/www/web/musk100_com/public_html/sitemap_baidu_sp.php</b>on line
这个和 Apache 设置有关系,目测是 Win 主机下特有问题。
解决办法有 2 个:
第 1 种:请打开 php.ini 然后把 output_buffering 设为 on 。重起 appache,OK(可以找主机商解决);
第 2 种:删除上文中百度开放适配代码中的第 25 行: header("Content-type: text/xml"); 应该可以解决。
四、伪静态规则
从第二步最后的访问地址可以看出,用的是 php 的动态路径,而百度写明了需要提交 xml 格式(其实,我发现 php 格式也可以提交成功),360 则写明了需要提交 txt 格式。于是,接下来就是将地址伪静态化。
编辑网站根目录的 .htaccess 文件,如下代码所示位置新增 8~11 行内容:
<Files ~ "^.(htaccess|htpasswd)$">
deny from all
</Files>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.zhangge.net)(:80)? [NC]
RewriteRule ^(.*) http://zhangge.net/$1 [R=301,L]
#sitemap-shipei-start
RewriteRule ^(sitemap_baidu_sp).xml$ $1.php
RewriteRule ^(sitemap_360_sp).txt$ $1.php
#sitemap-shipei-end
order deny,allow
.....略....
保存之后,应该可以直接访问 xml 和 txt 路径了,如:
http://zhangge.net/sitemap_baidu_sp.xml
http://zhangge.net/sitemap_360_sp.txt
五、前往提交
①、百度站长平台-开放适配:http://zhanzhang.baidu.com/mobiletools/add
提交成功预览:
②、360 站长平台-移动适配:http://zhanzhang.so.com/index.php?m=Urlmap&a=submit
提交成功预览:
若以上未出现问题,那恭喜你!一劳永逸地搞定了百度开放适配和 360 移动适配这项闲得蛋疼的项目...!
至此,张戈终于搞定百度开放适配和 360 移动适配专用 sitemap 没法自动更新的历史遗留问题!
六、效果展示
在手机上百度,site:zhagnge.net 可得到如下图结果:
看了上图,你可能会说,这不就只是收录了二级移动站么?那好,搜索 site:m.zhangge.net 试试:
看完上图无需多言,相信你已经明了百度开放适配是个啥效果了!
篇后语:php 代码是动态生成的,如此就保证了搜索引擎更新抓取的时候,是最新状态!而不会是之前那样苦逼手动去生成和更新!不过,暂时也稍有遗憾,仅仅生成了文章页面的对应关系,单页面和分类并未提供!不过,能适配文章也差不多了!
注意事项;
①、本文提供的方法仅适合 WordPress 建站程序,其他 PHP 建站程序仅提供参考思路;
②、代码默认支持 Linux 系统,若是 windows 系统,需要修改换行符,若有疑问请留言咨询。
最后,再次感谢 php 二次开发网的 php 技术支持!
文件下载
- Where's Waldorf?
- POj 1797 Heavy Transportation
- 卡特兰数简介原理性质应用参考:
- UVA Machined Surfaces
- NBUT 1117 Kotiya's Incantation
- React第三方组件1(路由管理之Router的使用④按需加载-上)
- React第三方组件1(路由管理之Router的使用③传参)
- Kindergarten Counting Game
- React第三方组件1(路由管理之Router的使用②多层级跳转及重定向)
- 括号配对问题描述输入输出样例输入样例输出解析代码实现运行结果参考链接
- React第三方组件1(路由管理之Router的使用①简单使用)
- POj 2253 Frogger
- React项目配置7(ES7的Async/Await的使用)
- HDU 1863 畅通工程
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 【Redis数据结构 序】使用redis-py操作Redis数据库
- 【Redis数据结构 String类型】String类型生产中的应用 缓存、计数器、限速器的实现
- Redis数据结构 List 类型】List 类型生产中的应用 消息队列、排行榜、朋友圈、监控程序的实现
- Crawlab准备之python+scrapy环境搭建
- 一致性协议之 ZAB
- Elasticsearch Analyzer原理分析并实现中文分词
- php laravel5.5使用rabbitmq消息队列
- 还不知道怎么运行Python代码,快来撸代码
- Linux常用命令速查表
- 机器学习中必须要会用的模块
- 【MathorCup】2020年 A题 无车承运人平台线路定价问题,特征间的相关性分析
- 决策树预测成本价 2020年 MathorCup数学建模 A题 无车承运人平台线路定价问题
- 2020年 MathorCup数学建模 A题 无车承运人平台线路定价问题,定价评价
- RabbitMQ 消费端限流、TTL、死信队列
- 全栈必备 Redis基础