标签归档:wordpress

WordPress的Action加载顺序

写WordPress代码时需要不停的与hooks(actions and filters)打交道,filter就像茶壶的过滤嘴,茶壶在哪它就在哪,顺序问题不那么重要。而action是一种行为,比如掀起壶盖和盖上壶盖之间 就可以放一个action,在这个action里可以放茶叶,不掀起壶盖是不可以放茶叶的,所以actions执行的顺序很重要。

 

钩子Hooks

钩子是让一段代码与另一段代码做交互的方法。它们是插件、主题与WordPress内核做交互的基础,当然WordPress内核里也广泛使用了。

钩子有两种:Actions和Filters。使用它们,你必须写一个回调函数,然后将它注册到WordPress关联到特定action或filter。

Filters让你可以在WordPress运行的时候修改一段数据的值。传入给回调函数的变量修改后被返回。它们是独立工作的,不会影响到函数外部的东西。

Actions则相反,允许你增加或修改WordPress的运行。回调函数会运行在WordPress运行到特定点的时候,可以做一些任务,比如:输出显示给用户、插入数据到数据库。

WordPress提供了许多钩子供你使用,你也可以自定义一些供其他开发者来修改你的插件或主题。

 

Actions

Actions钩子提供了函数一种方法可以让其他函数挂靠上来,然后额外的代码就可以在WordPress内核、插件、主题运行到特定点的时候执行了。

它们通过调用add_action()函数来工作,传入两个参数:你要挂靠的钩子名称、要运行的回调函数。比如:

<?php add_action( 'init', 'do_some_stuff' ); ?>

以上语句中,自定义do_some_stuff()函数会在WordPress运行init操作的时候被调用。

可以去代码参考的hook部分查看更多可用的action。如你经验丰富,对WordPress内核十分熟悉,可以直接去源代码里找合适的action。

示例

如果你想为Loop修改MySQL查询语句,你可以挂靠到pre_get_posts操作上。比如,你可以将指定CPT包含到搜索中:

<?php
function search_filter( $query ) {
    if ( ! is_admin() && $query->is_main_query() ) {
        if ( $query->is_search ) {
            $query->set( 'post_type', array( 'post', 'movie' ) );
        }
    }
}
add_action( 'pre_get_posts', 'search_filter' );
?>

还有比如,你想添加标签到HTML的<head>里,你可以挂靠到wp_head操作上。

<?php
function prevent_google_maps_resize() {
    echo '<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />';
}
add_action( 'wp_head', 'prevent_google_maps_resize' );
?>

非常重要的一个 url地址, 关于wordpress的

https://github.com/66beta/plugin-handbook-chs/blob/master/4.Hooks.md

 

 

WordPress中的actions

actions可以理解为一组在系统加载到某一时刻要执行的functions集合,使用do_action()添加,例如我们经常用到的get_header()函数,是这样定义的

1
2
3
4
5
6
7
8
9
10
11
12
13
function get_header( $name = null ) {
    do_action( 'get_header', $name );
    $templates = array();
    if ( isset($name) )
        $templates[] = "header-{$name}.php";
    $templates[] = 'header.php';
    // Backward compat code will be removed in a future release
    if ('' == locate_template($templates, true))
        load_template( ABSPATH . WPINC . '/theme-compat/header.php');
}

函数第二行用do_action()注册了一个action,叫做get_header

1
do_action( 'get_header', $name );

如果我们在functions.php中或者插件中写

1
add_action('get_header','my_fun')

my_fun()这个函数就会在do_action的位置执行,而不是在functions.php运行的位置执行。

Actions的执行顺序

了解WordPress中actions的执行顺序,可以知晓在这个action执行时,是否已经具备某些资源,例如登陆用户信心、例如插件API等。

要了解Actions的执行顺序,可以安装一个开发人员的插件WordPress Hook Sniffer,该插件不仅能告知actions的加载顺序,还能知道当前页面add_action操作有哪些,remove_action操作有哪些,还有filters信息。

这个simply-show-hooks插件也很好, 用来显示hook。

用这个插件查看了安装默认主题时action的执行顺序,捡了一些重要的记录下来,红色字体标记了一下比较重要的阶段。

muplugins_loaded (最先加载的action)

registered_taxonomy

registered_post_type

(加载所有激活的插件的文件,这是插件代码被执行的位置)

plugins_loaded

sanitize_comment_cookies

setup_theme

(载入当前主题的functions.php,functions.php中没有用add_filter或add_action添加的函数在这里被执行)

after_setup_theme (这个钩子看着眼熟吧,默认主题开头就有)

auth_cookie_malformed

auth_cookie_valid

set_current_user (这里执行了wp_set_current_user()函数,全局变量$current_user产生)

init

widgets_init

register_sidebar

wp_register_sidebar_widget

wp_default_scripts

wp_default_styles

admin_bar_init

add_admin_bar_menus

wp_loaded

parse_request

send_headers

parse_query

pre_get_posts

posts_selection

wp

template_redirect

加载激活的主题的模板(例如index.php、page.php等)

get_header

wp_head

wp_enqueue_scripts

wp_print_styles

wp_print_scripts

wp_print_scripts

get_footer

wp_footer

从上面的列表中可以看出一些问题:

  • 插件文件比主题的functions.php加载更早
  • 插件加载时,wp_set_current_user()尚未执行,因此在插件文件的body中无法直接获取用户信息
  • init和after_setup_theme的区别是,后者执行时尚未调用wp_set_current_user(),没有授权用户信息
  • 加 载主题模板文件发生在最后阶段,此阶段中不管是插件的代码还是functions.php中的代码都已执行,这样我们就不奇怪为什么在 single.php中调用query_posts()会增加查询次数,query_posts()大约在pre_get_posts的位置就执行完了, 等程序执行到single.php时,如果调用query_posts,只能推翻前面的结果重新查一遍。我们还能看出,避免这个问题的方法就是在 functions.php中使用filters函数(posts_join, posts_groupby等)更改query_posts的查询参数,因为functions.php早于query_posts执行,方法可以参考《自定义WordPress查询的4种方法》中的第三种方法。

理解万岁

与其枯燥的去记忆什么时候该用哪个action,不如理解一下WordPress的启动过程,了解actions加载的顺序,记忆几个比较重要的过程,例如哪些actions发生在插件代码执行以后,哪些actions发生在functions.php加载以后。

WordPress中wp_enqueue_script加载JavaScript

在 WordPress 中加载 JavaScript 最好使用 wp_enqueue_script() 函数以减少问题提高效率

WordPress 本身以及主题和插件通常需要加载一些 JavaScript 来实现某些特殊功能。为了最大限度地保证兼容性,不至于出现 JavaScript 失效的情况,所以一般在页头加载 JavaScript 文件。但是根据 Yahoo 开发者论坛的建议,加载 JavaScript 应该尽量在页尾以提高页面的显示(响应、渲染)速度。本文根据作者的使用经验介绍几个相关插件,并说明如何在某些特殊页面仍然在页头加载 JavaScript。

 

下面先简单介绍几个相关的优化 JavaScript 的 WordPress 插件及特点,然后演示如何处理一些特殊情况。

一. 优化JavaScript的WordPress插件

我曾经用过 WP Minify、Autoptimize、JavaScript to Footer这三个插件,下面一一介绍其特点。

1. WP Minify

这个插件将 Minify 引擎整合到 WordPress 中。一经启用,该插件就能够合并和压缩你的 JS 和 CSS 文件来提高页面的加载速度。

WP Minify 能够抓取生成的 WordPress 页面中的 JS/CSS 文件,将文件列表传递给 Minify 引擎。Minify 引擎处理后返回一个加强、精简并经过压缩的 JavaScript 或样式表文件(CSS),由 WP Minify 将其替换到 WordPress 页头中。

其主要特点是:

  • 易于使用;
  • 对 JavaScript、CSS 和 HTML 均有效;
  • 提供了调试工具;
  • 能够处理外部 JS 和 CSS 文件;
  • 能够排除指定 JS 和 CSS 文件;
  • 能够指定处理后的 JS 和 CSS 文件的位置(页头或页尾,甚至别的地方);
  • 可对处理后的 JS 和 CSS 文件添加过期时间等。

以前使用免费空间的时候,因为速度慢,我曾经利用这个插件在 K2 主题下的一个漏洞来减少访问网站时需要下载的内容量(详见给基于WordPress + K2 Theme的网站加速)。

当 WordPress 3.1 测试版出来后,我发现 WP Minify 与之不兼容,会导致网站无法正确加载。

2. Autoptimize

也许将来 WP Minify 升级后会解决不兼容问题,但是我等不及了。后来找到了 Autoptimize 这个具有类似功能的插件,而且这个插件操作更简单。

Autoptimize 整合、精简并压缩所有的 JS 和 样式表(CSS)文件,增加缓存过期标志。然后将样式表文件放到页头(同样是为了提高页面加载效率),并将 JS 文件放到页尾。它还能够精简 HTML 代码,给你的页面瘦身。不过我觉得给 HTML 页面瘦身作用不是很明显,只要你的服务器开启了 Gzip 压缩特性就没必要这么做了。

默认情况下,Autoptimize 会按照上面介绍的方式优化所有 HTML/CSS/JavaScript 。

我个人觉得,Autoptimize 是比 WP Minify 更好用的 WordPress 优化插件。

3. JavaScript to Footer

这个插件写的非常简洁。我查看了源代码,完成任务的代码只有 6 个 WordPress 函数(见下文),也就是 6 行。所以这个插件从创建之后就怎么更新过。我一开始就因为见它最后更改日期还停留在2009年9月22日,所以把它给忽略了。

但是它仅仅优化 JavaScript 的加载位置,也就是将所有在 WordPress 中正确声明了的 Javascript 文件都给移到页面末尾来加载。它没有对 HTML 代码和 CSS 样式表文件作任何处理。

根据 JavaScript to Footer 的源代码,它使用下面的 6 行代码来完成工作:

remove_action('wp_head', 'wp_print_scripts');
remove_action('wp_head', 'wp_print_head_scripts', 9);
remove_action('wp_head', 'wp_enqueue_scripts', 1);
add_action('wp_footer', 'wp_print_scripts', 5);
add_action('wp_footer', 'wp_enqueue_scripts', 5);
add_action('wp_footer', 'wp_print_head_scripts', 5);

如果有需要,可以在某个特定 WordPress 模板的 wp_head() 函数前加入下面的代码,将上述过程逆转过来,也就是使之失效,恢复成了本来的加载位置:

remove_action('wp_footer', 'wp_print_scripts', 5);
remove_action('wp_footer', 'wp_enqueue_scripts', 5);
remove_action('wp_footer', 'wp_print_head_scripts', 5);
add_action('wp_head', 'wp_print_scripts');
add_action('wp_head', 'wp_print_head_scripts', 9);
add_action('wp_head', 'wp_enqueue_scripts', 1);

当然只是说某些特定的页面模板,如果是所有页面,那干脆禁用该插件好了

二. 使用方法

相信对于大多数 WPer 来说,看了前面的介绍就知道如何选择自己需要的优化插件并合理使用了。无非是基于以下三个方面来考虑:

  1. 你的页面模板中是否使用了大量的 HTML 注释、空格、空行等标记?如果没有,那么你就不需要为了一点点(开启 Gzip 压缩时通常 1% 以下)的带宽节省而使用 HTML 精简功能;
  2. 你的页面中是否加载了多个 CSS 样式表文件?如果没有,你也不需要通过插件来精简和整合 CSS 样式表,手工精简和整合 CSS 样式表比使用插件更加简单有效;
  3. 基于 WordPress 默认会在页头中加载 JavaScript,一般的 WordPress 网站都需要对 JS 的加载位置进行优化。但是如果你大部分的页面也都需要在页面头部加载 JS 以保证不会出现 JS 失效的情况,那你就不能进行这样的优化了。

在我看来,WP Minify 就不需要了,原因在前面已经说过了。那么剩下的 Autoptimize 和 JavaScript to Footer 可以选用其一或者两者配合使用(如果是配合使用,当然是使用前者的 HTML 和 CSS 精简/整合功能,而使用后者的 JS 位置控制功能,因为后者就这一个功能)。我只需要控制 JS 的加载位置,所以就选择了 JavaScript to Footer。因为我的页面中也就四五个 JS 文件,又是放到页尾加载,我觉得没必要进行整合。

三. 特殊情况处理

虽然将 JavaScript 文件都放到页面末尾加载对于页面加载速度很有帮助,但是请注意,所谓页面末尾指的是在 WordPress 的 wp_footer() 函数中调用,这个函数通常刚好位于页面的 </body> 标签前面(当然是末尾了)。

有时候我们可能会在 wp_footer 函数出现之前就需要用到某些 JavaScript,比如 jquery.js 文件。

这样的情况也是很常见的。比如我单独创建了一个链接页面,在这个页面中我使用了 jQuery 方法来获取链接网站的 favicon。很显然,我只需要在这唯一一个页面使用这部分代码,所以将这段代码直接放在这个页面模板中是最好的做法。问题来了:这部分内容显然是在 wp_footer 之前出现的,那么这段代码就在 jquery.js 文件之前出现了,导致该代码段实际上无法工作,因为调用 jQuery 方法的代码段必须比 jquery.js 文件后加载。

从上面的情景中就很容易理解我所说的特殊情况了。在我的Buzz和站外资源 2 个特殊页面里,我在自建的页面模板中加载了一些特殊的 JavaScript 代码(详见将Buzz输出整合进网页和为WordPress创建个性化链接页面)。

那么如何处理这种特殊情况呢?其实也很简单。以上面的情景为例,既然我们需要先调用 jquery.js 文件,那我们就在该代码段之前直接输出需要的 jquery.js 文件,不使用 wp_enqueue_script() 函数,而改用 wp_print_scripts() 函数。

wp_enqueue_script() 与 wp_print_scripts() 的区别是:wp_enqueue_script() 是告诉 WordPress “我在这个页面上需要用到某个 JavaScript 文件,你可要记得加载啊”。WordPress 默认在 wp_head() 中处理,而我们改为在 wp_footer() 中处理。wp_print_scripts() 则直接在你使用此方法的位置输出需要的 JavaScript 文件,而不是加入到 WordPress 的处理任务中。

如果我们在页面的中间使用,

 <?php wp_print_scripts('jquery'); ?>

直接输出了 jquery.js 文件(通常是其压缩版本 jquery.min.js),那么即使其它的插件或者什么东西使用,

 <?php wp_enqueue_script('jquery'); ?>

告诉 WordPress 需要加载 jquery.js,WordPress 在 wp_footer() 中处理的时候也会先检查前面是不是已经有了,如果有了就不会再重新加载一次。

四. 结论

在 WordPress 中加载 JavaScript 最好使用 wp_enqueue_script() 函数以减少问题提高效率。如果不是有这些特殊情况要处理,使用 Autoptimize 显然比较好,它全面完成任务而且使用简单。

但是如果使用的主题本身已经很简洁了,那么 JavaScript to Footer 更简单高效,也就更好。

本文发表于水景一页。

介绍几个JS和CSS压缩合并插件

由于添加各种功能的代码和 wordpress插件 ,会导致JS和CSS增多,影响了wordpress博客的加载速度。虽然可以用代码来对JS和CSS进行压缩合并,可是对初学者不是那么简单,很容易出错。因此介绍几个JS 和CSS 压缩合并插件,方便初学者进行优化。

Better WordPress Minify

Better WordPress Minify 是将Minify引擎集成到wordpress博客上,一旦被启用,它将合并和压缩所有的 JS 和 CSS 文件,从而降低网页的加载时间。

Better WordPress Minify插件使用很简单。安装并启用插件后,会自动压缩合并你的JS和CSS文件。当然你可以在设置页面中,进行如下更细致的设置。

  • 删除不必要的空格与空行。
  • 合并多个CSS或JavaScript文件。
  • 自动缩小的JS文件。
  • 自动缩小CSS文件。
  • 并提供gzip压缩。
  • 缩小代码bloginfo()样式表?
  • 缩小网址。
  • 缓存目录。

30453013_1

 

 

JS & CSS Optimizer

JS & CSS Optimizer 是一款JS和CSS优化插件,可以把多个JS和CSS文件合并到一个文件上,降低HTTP请求的次数。

30453013_3

 

30453013_4

 

Scripts Gzip

Scripts Gzip 也是一款wordpress js,css压缩合并插件,根据需要重写CSS文件的url()。

30453013_5

 

 

HeaderJS Loader

HeaderJS Loader 是一款可以通过 Head JS 来选择加载JS文件的wordpress插件。

30453013_6

External Files Organizer

External Files Organizer 可以自动对css和js进行压缩合并,生成wp_head()和wp_footer()。

WordPress插件开发实例教程-版权插件

本文记录WordPress插件开发实例过程, 本文以版权显示为例子进行

说明:本教程仅限学习,高手请绕道

开发程序:WordPress 3.9-RC1

使用主题:Twenty Fourteen

在开始之前,需要注意三件事情

I、给插件取一个个性化的名字,越个性化越好,以防和其他插件重名冲突。

II、代码里面,一定要包含注释,不为自己,也要为想修改你代码的别人想想。

III、尽量用最新版的 WordPress 进行开发和测试。

插件名称和插件结构

一般来说,都是在 wp-content\plugins 目录下建立一个文件夹,文件夹名就是插件的名称,我们插件名字为"copyright_plugin",文件结构如下。

\wp-content\plugins\copyright_plugin下有copyright_plugin.php和readme.txt

这里的 readme.txt 文件中包含了一些插件的介绍,使用说明等信息,主要是提交到 WordPress 官方网站时候用到的,可以参考他们给的模板 http://wordpress.org/extend/plugins/about/readme.txt,另外还有插件截图预览的功能,需要另外添 加图片,但是我们现在是练习,不需要提交到官网,所以暂时先不涉及这些。

插件的核心

总的来说,插件的核心是两个 function,用来添加 Hooks(中文译为钩子)

add_action ($hookname, $callbackfunction)
add_filter ($hookname,$callbackfunction)

这两个方法相当重要,几乎所有的插件都要用到他们。

Actions,我理解就是 wordpress 核心代码预留的一些特殊的切入点,或者说是在执行一些特定事件时候发生,例如文章发布时,或者访客留言时触发。
Filters,应该就是 wordpress 执行时,对数据传输过程的一种过滤机制,例如当文章保存到数据库的过程,或者文章从事数据库中取出,展现到浏览器中的这个过程。

我们今天要制作的插件,应该是用 Filters,因为我们要在文章显示在浏览器之前,在最后面加上一段字符窜,用来显示版权信息,后面添加菜单项的时候,也要用到 Actions。

插件概要信息

用文本编辑器打开 copyright-plugin.php 文件,输入如下信息:

<?php  
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.xxxx.com/plugins/
Description: 此插件将在文章正文最下面,显示一行版权信息
Version: 1.0.0
Author: xcxc
Author URI: http://www.xxxx.com/
License: GPL
*/
?>

保存好文件,然后登录 WordPress 后台,打开插件菜单,应该就可以看到这个插件,已经显示在插件列表里面了,并且可以启用这个插件试试,不过没有任何效果,因为到目前为止,这个插件还没有实现任何功能。

为插件实现功能

修改copyright_plugin.php

<?php  
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.xxxx.com/plugins/
Description: 此插件将在文章正文最下面,显示一行版权信息
Version: 1.0.0
Author: xcxc
Author URI: http://www.xxxx.com/
License: GPL
*/
 
/* 此插件将在文章正文最下面,显示一行版权信息 */ 
function display_copyright() {  
    return "<p style='color:red'>本站点所有文章均为原创,转载请注明出处!</p>";  
}  
?>

保存好这个文件,然后打开正在用的主题文件夹,打开index.php 文件夹,找到 get_template_part( 'content', get_post_format() ); 并在下面添加如下代码

if(function_exists('display_copyright')) {  
    echo display_copyright();  
}  

function_exists 是判断 display_copyright 函数是否存在,因为当插件停用的时候,主题代码里面是找不到这个函数的,所以要判断一下,防止出错。

然后在 wordpress 后台启用该插件,再打开首页看看效果吧!

至此,这段代码,应该可以勉强算是一个插件了。之所以说勉强,是因为这个插件存在一个问题,需要手工去修改主题代码,如果用户换了主题的话,需要在新主题里面再次修改代码,这个不好。

改良插件

还记得我们前面说过的 Hooks (钩子)吗,我们要开始用 Filter 钩子了!

代码修改copyright_plugin.php如下:

<?php  
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.xxxx.com/plugins/
Description: 此插件将在文章正文最下面,显示一行版权信息
Version: 1.0.0
Author: xcxc
Author URI: http://www.xxxx.com/
License: GPL
*/
add_filter( 'the_content',  'display_copyright' );  
 
/* 这个函数在日志正文结尾处添加一段版权信息,并且只在 首页 页面才添加 */ 
function display_copyright( $content ) {  
    if( is_home() )  
        $content = $content . "<p style='color:red'>本站点所有文章均为原创,转载请指明出处!</p>";  
 
    return $content;  
}  
?>

参看以上代码,其中 the_content 是钩子的名字,display_copyright 是回调函数名称。这样一来,只要启用插件就可以实现功能,无需去修改主题了,请把刚才在index.php 文件中添加的代码删掉,然后启用插件,看看效果吧,显示效果应该是一样的,无论怎么换主题,还是会自动显示版权信息。

is_home是判断是不是主页

更进一步

至此一个真正的插件算是完成了。但是此插件将版权信息直接写在代码里,如果用户想自定义版权信息的话,需要修改插件的源代码,仍然不方便,所以此插件仍需改进。其实,我们可以在 WordPress 后台中为插件单独添加一个菜单和页面,用户可以在这里来自定义设置设置版权信息,信息可以保存在数据库里面。

先附上完整代码,后面会做说明

<?php  
/*
Plugin Name: Copyright plugin
Plugin URI: http://www.xxxx.com/plugins/
Description: 此插件将在文章正文最下面,显示一行版权信息
Version: 1.0.0
Author: xcxc
Author URI: http://www.xxxx.com/
License: GPL
*/

/* 注册激活插件时要调用的函数 */ 
register_activation_hook( __FILE__, 'display_copyright_install');   

/* 注册停用插件时要调用的函数 */ 
register_deactivation_hook( __FILE__, 'display_copyright_remove' );  

function display_copyright_install() {  
    /* 在数据库的 wp_options 表中添加一条记录,第二个参数为默认值 */ 
    add_option("display_copyright_text", "<p style='color:red'>本站点所有文章均为原创,转载请注明出处!</p>", '', 'yes');  
}

function display_copyright_remove() {  
    /* 删除 wp_options 表中的对应记录 */ 
    delete_option('display_copyright_text');  
}

if( is_admin() ) {
    /*  利用 admin_menu 钩子,添加菜单 */
    add_action('admin_menu', 'display_copyright_menu');
}

function display_copyright_menu() {
    /* add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function);  */
    /* 页名称,菜单名称,访问级别,菜单别名,点击该菜单时的回调函数(用以显示设置页面) */
    add_options_page('Set Copyright', 'Copyright Menu', 'administrator','display_copyright', 'display_copyright_html_page');
}

function display_copyright_html_page() {
    ?>
    <div>  
        <h2>Set Copyright</h2>  
        <form method="post" action="options.php">  
            <?php /* 下面这行代码用来保存表单中内容到数据库 */ ?>  
            <?php wp_nonce_field('update-options'); ?>  
 
            <p>  
                <textarea  
                    name="display_copyright_text" 
                    id="display_copyright_text" 
                    cols="40" 
                    rows="6"><?php echo get_option('display_copyright_text'); ?></textarea>  
            </p>  
 
            <p>  
                <input type="hidden" name="action" value="update" />  
                <input type="hidden" name="page_options" value="display_copyright_text" />  
 
                <input type="submit" value="Save" class="button-primary" />  
            </p>  
        </form>  
    </div>  
<?php  
}  

add_filter( 'the_content',  'display_copyright' );  
 
/* 这个函数在日志正文结尾处添加一段版权信息,并且只在 首页 页面才添加 */ 
function display_copyright( $content ) {  
    if( is_home() )  
        $content = $content . get_option('display_copyright_text'); 
 
    return $content;  
}  
?>

说明:

以下代码自己要是在启用插件时和停用插件时调用,注释中已经写得很详细了。

/* 注册激活插件时要调用的函数 */ 
register_activation_hook( __FILE__, 'display_copyright_install');   

/* 注册停用插件时要调用的函数 */ 
register_deactivation_hook( __FILE__, 'display_copyright_remove' );  

function display_copyright_install() {  
    /* 在数据库的 wp_options 表中添加一条记录,第二个参数为默认值 */ 
    add_option("display_copyright_text", "<p style='color:red'>本站点所有文章均为原创,转载请注明出处!</p>", '', 'yes');  
}

function display_copyright_remove() {  
    /* 删除 wp_options 表中的对应记录 */ 
    delete_option('display_copyright_text');  
}

添加菜单和页面的代码如下:

if( is_admin() ) {
    /*  利用 admin_menu 钩子,添加菜单 */
    add_action('admin_menu', 'display_copyright_menu');
}

function display_copyright_menu() {
    /* add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function);  */
    /* 页名称,菜单名称,访问级别,菜单别名,点击该菜单时的回调函数(用以显示设置页面) */
    add_options_page('Set Copyright', 'Copyright Menu', 'administrator','display_copyright', 'display_copyright_html_page');
}

至此,已经可以在后台看到菜单项了,但是点击的话,还会出错,因为还没有添加对应的页面(如何自定义添加后台菜单位置

下面开始添加页面,主要代码如下:

function display_copyright_html_page() {
    ?>
    <div>  
        <h2>Set Copyright</h2>  
        <form method="post" action="options.php">  
            <?php /* 下面这行代码用来保存表单中内容到数据库 */ ?>  
            <?php wp_nonce_field('update-options'); ?>  
 
            <p>  
                <textarea  
                    name="display_copyright_text" 
                    id="display_copyright_text" 
                    cols="40" 
                    rows="6"><?php echo get_option('display_copyright_text'); ?></textarea>  
            </p>  
 
            <p>  
                <input type="hidden" name="action" value="update" />  
                <input type="hidden" name="page_options" value="display_copyright_text" />  
 
                <input type="submit" value="Save" class="button-primary" />  
            </p>  
        </form>  
    </div>  
<?php  
}

现在再去点击刚才新加的菜单,可以显示出来一个页面了,我们可以在这里设置版权信息文本。

另外还有如下代码要修改

/* 这个函数在日志正文结尾处添加一段版权信息,并且只在 首页 页面才添加 */ 
function display_copyright( $content ) {  
    if( is_home() )  
        $content = $content . get_option('display_copyright_text'); 
 
    return $content;  
}

将原来的静态化文本,改成动态的,之所以要这么改,是因为我们已经将数据存到数据库里面了,这里要从数据库里面取出数据。

来源:http://www.cnblogs.com/xcxc/p/3664408.html

前端jquery的cdn加速节点

做前端的朋友们肯定经常接触春哥今天要分享的东西,没错,他就是大名鼎鼎的jQuery。今天春哥技术博客就花点时间总结一下关于jQuery的那些事。jQuery是一个兼容多浏览器的javascript框架,核心理念是write less,do more(写得更少,做得更多)。jQuery在2006年1月由美国人John Resig在纽约的barcamp发布,吸引了来自世界各地的众多JavaScript高手加入,由Dave Methvin率领团队进行开发。如今,jQuery已经成为最流行的javascript框架,在世界前10000个访问最多的网站中,有超过55%在使用jQuery。
jQuery是免费、 开源的,使用MIT许可协议。jQuery的语法设计可以使开发者更加便捷,例如操作文档对象、选择DOM元素、制作动画效果、事件处理、使用Ajax以 及其他功能。除此以外,jQuery提供API让开发者编写插件。其模块化的使用方式使开发者可以很轻松的开发出功能强大的静态或动态网页.....以上内容太官方化,不是我们今天所探讨的主要内容,今天要为大家分享的是大家必须要知道的几个jQuery的cdn加速节点。大家都知道,jQuery虽然强大,但是体积不小,min版经过压缩后最小也要90多kb,如果我们在本地直接加载的话,势必会影响网页的响应速 度,那么我们如何解决这个jQuery加载慢的问题呢?这时我们就要用到cdn加速节点,其实网络上目前有很多jQuery的cdn加速节点,甚至连 jQuery官网也有提供,但是我们最好选择一个距离较近的节点使用,比如我们网站主要是针对国内用户的话,那最好就选择国内的jQuery的cdn加速 节点,如果是面向国外用户那自然是选择国外的jQuery cdn加速节点了....下面我们就来看一下具体有哪些吧,min就是已经压缩处理的意思。

1、谷歌jquery cdn加速点

http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js

http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js

http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js

2、微软jquery cdn加速点

http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js

http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js

http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js

http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.0.min.js

3、新浪jquery cdn加速点

http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js

http://lib.sinaapp.com/js/jquery/1.9.0/jquery.min.js

http://lib.sinaapp.com/js/jquery/1.9.0/jquery.js

http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js

http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.js

http://lib.sinaapp.com/js/jquery/2.0/jquery.min.js

http://lib.sinaapp.com/js/jquery/2.0/jquery.js

http://lib.sinaapp.com/js/jquery/2.0.1/jquery-2.0.1.min.js

http://lib.sinaapp.com/js/jquery/2.0.1/jquery-2.0.1.js

http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js

http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.map

http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.js

http://lib.sinaapp.com/js/jquery/2.0.3/jquery-2.0.3.min.js

http://lib.sinaapp.com/js/jquery/2.0.3/jquery-2.0.3.js

http://lib.sinaapp.com/js/jquery/2.0.3/jquery-2.0.3.min.map

4、加速乐jquery cdn加速点

http://mini.jiasule.com/framework/jquery/1.8.0/jquery-1.8.0.min.js

http://mini.jiasule.com/framework/jquery/1.8.1/jquery-1.8.1.min.js

http://mini.jiasule.com/framework/jquery/1.8.3/jquery-1.8.3.min.js

http://mini.jiasule.com/framework/jquery/1.9.0/jquery-1.9.0.min.js

http://mini.jiasule.com/framework/jquery/1.9.1/jquery-1.9.1.min.js

5、百度jquery cdn加速点

http://libs.baidu.com/jquery/2.0.0/jquery.min.js

http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js

6、jQuery官网cdn加速点(国外)

http://code.jquery.com/jquery-1.9.1.min.js

http://code.jquery.com/jquery-2.1.0.min.js

http://code.jquery.com/jquery-2.1.1.min.js(支持IE版本≥9.0)

7、cloudflare jQuery cdn加速点(国外)

http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.0/jquery.min.js

8、又拍云jQuery cdn加速点

http://upcdn.b0.upaiyun.com/libs/jquery/jquery-2.0.3.min.js

http://upcdn.b0.upaiyun.com/libs/jquery/jquery-2.0.2.min.js

http://upcdn.b0.upaiyun.com/libs/jquery/jquery-2.0.1.min.js

http://upcdn.b0.upaiyun.com/libs/jquery/jquery-1.10.2.min.js

http://upcdn.b0.upaiyun.com/libs/jquery/jquery-1.9.1.min.js

9、360安全卫士jQuery cdn加速点

http://libs.useso.com/js/jquery/2.1.1-rc2/jquery.min.js

http://libs.useso.com/js/jquery/2.1.1-rc2/jquery.min.map

http://libs.useso.com/js/jquery/2.1.1-rc2/jquery.js

http://libs.useso.com/js/jquery/2.1.1/jquery.js

http://libs.useso.com/js/jquery/2.1.1/jquery.min.js

http://libs.useso.com/js/jquery/2.1.1/jquery.min.map

http://libs.useso.com/js/jquery/2.1.0/jquery.js

http://libs.useso.com/js/jquery/2.1.0/jquery.min.js

http://libs.useso.com/js/jquery/2.1.0/jquery.min.map

http://libs.useso.com/js/jquery/1.9.1/jquery.js

http://libs.useso.com/js/jquery/1.9.1/jquery.min.js

http://libs.useso.com/js/jquery/1.9.1/jquery.min.map

http://libs.useso.com/js/jquery/1.8.3/jquery.js

http://libs.useso.com/js/jquery/1.8.3/jquery.min.js

选择好你的jQuery cdn加速点之后直接在网页中使用< script type="text/javascript" >....< /script >调用即可,建议不要放到head中,而是放到< /body >前,原因你懂得。

来源:http://www.cgtblog.com/qd/315.html