WordPress 插件开发教程 – Part-3 – 钩子( hooks )

钩子是 WordPress 的精髓。他们允许插件开发人员钩进 WordPress 工作流程内部来改变它的工作,而不用直接修改核心代码。这就使得用户可以方便的升级到 WordPress 的新版本而不需要修改一行代码。

如果一个开发人员修改了核心代码,这些改动在 WordPress 下一次升级的时候就会消失。升级会覆盖这些改动。使用钩子让你能够在核心以外的目录中单独开发插件,这就在升级时保证了插件代码的安全。

没有钩子,插件就没办法改变 WordPress 的功能了。本节介绍的钩子系统会贯穿整个教程,同时也会在几乎每一个插件的开发中用到。在你学会了钩子的用法后,你就会明白为什么 WordPress 这个平台这么强大,并有上千个插件供几百万用户使用了。

WordPress 主要有两种类型的钩子:动作钩子和过滤器钩子(action hooks and filter hooks )。第一个使得你可以在一个特定时刻上执行一个函数,第二个使得你可以操作通过钩子的输出。

钩子不是仅仅针对插件的。WordPress 内部也使用钩子。如果你浏览核心代码,你就能见到很多 WordPress 自己钩自己的例子了。

动作钩子 ( actions )

动作钩子让你可以在 WordPress 加载过程中或者当某个事件发生的特定时刻触发一个函数。例如:你可能希望当 WordPress 第一次加载一个页面或者保存一篇文章时执行一个函数。

你需要理解 do_action() 函数。当钩进 WordPress 中时,你的插件不会直接调用这个函数;但是你的插件几乎都会间接的使用它。

  • $tag — 动作钩子的名称
  • $arg — 传递给已注册的动作的值。它看起来像一个单独的参数,但通常都不是这样的。动作钩子可以传递任何个数的参数,或者根本不传参数。对特殊的钩子,你需要查看 WordPress 的源码,因为参数个数在每个钩子的基础改变。

    下面是一个具有多参数的动作钩子的例子:

    下面看看一个叫做 wp_head 的钩子是怎么出现在 WordPress 中的。这个钩子出现在前台的 里面。 WordPress 和插件经常用这个钩子来添加 meta 信息,样式表,和 js 脚本。

    当这段代码在 WordPress 中执行时,它会寻找任何为 wp_head 动作钩子注册的动作。然后按照特殊顺序执行它们。如你所见,它名叫 wp_head 但是没有传递额外的参数。动作钩子通常都这样。下面是有两个额外参数的动作钩子的例子:

    这个 save_post 的钩子传递两个参数,一个 $post_ID,一个 $post。

    什么是动作?

    从技术上讲,一个动作就是一个 PHP 函数。一个函数要成为一个动作,它需要被注册成一个动作钩子。在上面的部分可以看到什么是动作钩子,但是动作钩子要用作任何目的,需要有个动作为它们注册。这就是插件的来源。你开发的自定义的函数(动作)当动作钩子出发之后就可以执行一个特定任务了。要实现这个,就要使用 add_action() 函数。

    • $tag – 你的函数执行时代动作钩子的名称。
    • $function – WordPress 要调用的函数名。
    • $priority – 一个表示动作调用顺序的整数,默认是10。数字越小,这个函数越早被调用。
    • $accepted_args – 动作钩子要传递给你的函数的参数个数。默认只有一个参数。

    动作钩子并不局限于单个动作。你的插件可以将多个函数添加到一个动作钩子上。其他插件,甚至是 WordPress 核心,经常将多个函数添加到同一个钩子上。

    现在是使用动作钩子的时候了。一个常见的动作钩子是 wp_footer 。它提供给前端用户的 WordPress 模板使用。通常它刚好在前调用。在下面的例子中,将要为 wp_footer 注册一个动作并添加一条自定义信息到 footer。

    WordPress 架设。;
    }
    ?>

    仔细看看上面的代码中如何使用 add_action() 函数的。

    第一个参数是钩子的名字( wp_footer )。第二个参数是要回调的函数 ( boj_example_footer_message )。第三个参数是优先级 ( 100 )。这个函数比起其他钩到 wp_footer 中的函数,会在比较靠后的次序执行。如果设置成1,就较先执行。

    要说明,钩子可能会因为许多原因在 WordPress 执行过程中多次触发。任何添加到这个钩子中的动作每当钩子触发时都会执行一次。

    动作钩子函数

    你已经知道了最基本的两个动作钩子函数怎么使用;do_action() 和 add_action()。WordPress 还有其他类型的与动作钩子相关的函数用于插件开发。

    do_action_ref_array() 函数和 do_action() 函数完成同样的工作,只不过参数传递的方式不同。它并不传递通过附加参数的值来确定的多个参数,而是传递一个包含参数的数组。这个参数数组也是一个必须的参数。这个函数的目的是通过引用传递一个对象给添加到特定钩子的动作(函数)。这意味着这个函数可以不用返回就改变对象本身。
    • $tag – 动作钩子的名字。
    • $args – 要传递给注册到这个钩子的函数的参数的数组。通常,这是一个动作可以改变的对象。

    下面看一个 WordPress 如何调用 do_action_ref_array() 的实例。下面的代码展示了 pre_get_posts 动作钩子。WordPress 在从数据库取得 posts 之前执行这个钩子,使得插件可以改变查询 posts 的方式。

    第一个参数 pre_get_posts 是钩子的名字。第二个参数是从数据库中查询 posts 的参数的数组。这个钩子使你可以执行基于那个参数数组的代码。

    假如你想安装随机的顺序来得到首页的 blog,而不是默认的通过发布时间来得到。你就需要注册一个动作到这个钩子,并改变排序顺序。

     is_home &&empty($query-> query_vars['suppress_filters']))
            $query-> set('rderby','rand');
    }
    ?>

    remove_action() 可以删除先前添加到一个钩子的动作。代表性的,你可以删除 WordPress 默认添加的动作。要删除一个动作,这个动作必须已经用 add_action() 函数添加了。如果你在动作注册之前执行 remove_action(),那么动作并不会被从钩子中删除。

    如果动作被成功删除,则函数返回 true,否则返回 false。

    参数类似于 do_action()。要成功的从一个钩子中删除一个动作, $tag, $function_to_remove, 和 $priority 必须完全的符合 do_action() 中使用的参数。否则动作不会被溢出,同时 remove_action() 返回 flase。

    我们看一个叫做 rel_canonical 的 WordPress 默认动作。这个动作在 和 元素之间添加一个 canonical 链接。

    要删除这个动作,就要使用 remove_action() 函数。你需要定义 $tag 和 $function_to_rmove 参数。这里你不用添加 $priority 因为先前定义动作的时候没有明确指定优先级。

    WordPress、plugin 或者 theme 添加的任何动作都可以在插件中删除。通常只删除 WordPress 添加的动作。许多默认的动作都定义在 wp-includes/default-filters.php 文件中。通过浏览这个文件你就会明白 WordPress 是如何使用动作钩子的。

    remove_all_actions

    在有些插件中,可能需要删除所有特定 tag 或者 特定 tag + 特定优先级的所有钩子。使用 remove_all_actions() 可以一次删除所有符合条件的动作。

    $priority 参数是可选的,默认是 false。如果你设置了这个参数,那么只有这个优先级的动作会被删除。下面的例子从 wp_head 动作钩子中删除不管任何优先级的动作。

    在使用这个函数的时候必须要小心。其他 plugin 或者 theme 可能添加了你不知道动作。这就可能破坏插件应有的功能。通常应该保持你的代码尽可能的特殊。在大多数情况下,你应该使用 remove_action() 函数来代替。

    有的时候需要确定一个钩子是否包含一些动作,或者一个特定的动作是否已经添加到了钩子里面。has_action() 提供了这些功能。

    has_action() 函数的返回值是 Boolean 或者 一个整型值。如果 $function_to_check 参数为空,那么如果有动作已经添加到了钩子中就返回 true,反之,返回 false。而如果 $function_to_check 设置了,而且这个函数已经添加到了钩子里面,则返回该动作的优先级,否则返回 false。

    下面的例子中,根据 wp_footer 动作钩子中是否有注册的动作来确定显示的信息。

     footer 中已经注册有动作了。

    '; else echo'

    footer 中还没有注册动作。

    '; ?>

    下面看一个 WordPress 核心添加到 wp_footer 中的动作。wp_print_footer_script() 默认注册给这个钩子。

    did_action() 使你的插件可以检查一个动作钩子是否已经被执行,或者记录执行的次数。这也意味着这一次页面的加载过程中有些动作被执行了多次。

    这个参数返回动作已经执行的次数,如果还未执行,返回 false。这个函数的一般用途是判断一个动作钩子是否已经被触发,并执行基于 did_action() 的返回值的代码。

    下面的例子中,如果 plugins_loaded 动作钩子已经被触发,就定义一个 PHP 常量。

    register_activation_hook 和 register_deactivation_hook

    在第二章中已经介绍了这两个函数。

    常用的动作钩子

    WordPress 有许多动作钩子,有一些是很常用的。

    plugins_loaded

    对插件开发者来说,plugins_loaded 动作钩子也许是最重要的动作钩子了。它在大多数 WordPress 文件加载完成之后,并在pluggable 函数和 WordPress 开始执行任何东西之前触发。在大多数的插件中,在这个钩子触发之前,不应该执行其他的代码。plugins_loaded 在所有用户启用的插件都被 WordPress 加载之后执行。这也是在加载过程中插件开发这最早能用到的钩子。

    WordPress 的插件应该在这个钩子中执行安装。其他动作也应该添加到这个钩子的回调函数中。

    下面的例子中,使用前面部分创建的 boj_example_footer_message 动作。要把它添加到钩到 plugins_loaded 钩子中的安装动作中,而不是单独调用它。

    WordPress 架设。;
    }
    ?>

    创建一个安装函数并把它钩到 plugins_loaded 中。这样做就可以确保不会由于特定的 WordPress 函数还没有加载而触发错误。

    init

    init 钩子在大多数的 WordPress 都建立之后。WordPress 同样添加许多内部的功能到这个钩子中,例如 post types 和 taxonomies 的厨厕以及默认 widgets 的初始化。

    因为这时几乎 WordPress 中的所有内容都就绪了,当 WordPress 的所有信息都可用时,你的插件使用这个钩子差不多可以做任何需要的事情了。

    下面的例子中,为用户添加了给 pages 写摘要的功能。这应该在 init 中执行,因为 “page” post type 在这时使用 add_post_type_support() 函数来创建。( 详见 Part-11, “扩展 posts”)

    admin_menu

    admin_menu 钩子在管理员页面加载的时候调用。无论何时你的插件直接在管理页面下工作,你都要用这个钩子来执行你的代码。

    下面的例子添加了一个内容是 BOJ Settings 的 sub-menu 项到 WordPress 管理页面的设置菜单。(详见:Part-7,”插件设置”)

    template_redirect

    template_redirect 动作钩子很有用,因为它是 WordPress 知道用户正在浏览的页面的关键。它在特定的页面选择 theme template 之前执行。在只在网站的前端触发,并不在管理员页面触发。

    当你需要为特定的页面加载代码的时候,这个钩子很有用。

    下面的例子中,仅仅为 singular post 加载一个样式表文件。

    wp_head

    在网站的前端,WordPress 的模板调用 wp_head() 函数,会触发 wp_head 钩子。插件使用这个钩子在 和 标签之间添加 HTML。

    下面的例子中在前端添加一个 meta description。

    ';
    }
    ?>

    有些插件错误的使用了 wp_head 动作钩子来添加 JavaScript 代码,实际上应该使用 wp_enqueue_script() 函数的。( 详见:Part-12,”JavaScript 和 AJAX “)。唯一一种使用这个钩子来添加 JavaScript 的情形是当 JavaScript 代码不在一个单独的文件中时。

    过滤器 Filters

    过滤器钩子和动作钩子有很大的区别。它让你可以控制代码的输出。动作钩子是让你插入代码,而过滤器钩子让你重写 WordPress 传递给钩子的代码。你的函数会对输出进行”过滤”。

    要掌握过滤器钩子的概念,必须首先明白 WordPress 的 apply_filters() 函数是如何工作的。

    • $tag – 过滤器钩子的名字。
    • $value – 传递给任何添加到这个钩子的过滤器的参数。这个函数可以添加任意个额外的 $value 参数传递给过滤器。

    注意:在写一个过滤器的时候 $value 必须返回给 WordPress。

    下面是 WordPress 核心的一个过滤器钩子的例子:

    这个例子中,template_include 是一个过滤器钩子的名字,$template 是一个可以通过注册到这个过滤器钩子的过滤器改变的文件名。

    什么是过滤器?

    一个过滤器是一个注册到过滤器钩子的函数。这个函数最少接受一个参数并在执行完代码后返回那个参数。没有过滤器的过滤器钩子没有任何作用。插件开发者可以通过过滤器钩子改变不同的变量 – 从字符串到多位数组。

    当一个过滤器钩子被 apply_filters() 函数调用时,所有注册到这个钩子的过滤器都会被执行。要添加一个过滤器,使用 add_filter() 函数。

    和动作钩子添加动作类似。$accepted_args 是过滤器函数 $function 接受的参数个数,默认是1。你的函数必须至少接受一个参数并返回。

    可以给一个过滤器钩子添加多个过滤器。同样其他 WordPress 插件也可以给这个钩子添加过滤器。过滤器钩子并不限制给一个钩子。注意:因为每个过滤器都必须返回一个值供其他过滤器使用。如果你的函数没有返回值,那就可能会破坏整个 WordPress 或者其他的插件。

    下面看看 wp_title 过滤器钩子,它是负责页面的 元素的过滤器钩子。</p> <div> <div id="highlighter_430273" class="syntaxhighlighter php"> <pre><code class="language-php"><?php apply_filters( 'wp_title', $title,$sep,$seplocation); ?></code></pre> </div> </div> <ul> <li>wp_title – 钩子名。</li> <li>$title – 一个字符串,要过滤并返回给 WordPress 的值。</li> <li>$sep – 说明 <title> 元素之间的分隔符是什么。</li> <li>$seplocation – 分隔符的位置。下一个例子中要用到。</li> </ul><p>现在写一个函数来过滤 $title 的输出 – 在页面的 title 后面附加站点的名字:</p> <div> <div id="highlighter_949063" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'wp_title', 'boj_add_site_name_to_title', 10, 2 ); function boj_add_site_name_to_title( $title,$seq) { /* 得到网站名称 */ $name = get_bloginfo('name'); /* 附加到 $title 变量。 */ $title.=$sqp.' '.$name; /* 返回 $title */ return$title; } ?></code></pre> </div> </div> <p>boj_add_site_name_to_title() 函数修改 $title 参数并返回给 WordPress。$sep 参数在函数中使用,但没有返回。</p> <h3>过滤器钩子函数</h3> <p>除了前面提到的 apply_filters() 和 add_filter() 函数,WordPress 还提供其他的操作过滤器钩子的函数。</p> <h4>apply_filters_ref_array</h4> <p>类似于动作钩子里面的 do_action_ref_array() 函数。</p> <div> <div id="highlighter_68552" class="syntaxhighlighter php"> <pre><code class="language-php"><?php apply_filters_ref_array($tag,$args); ?></code></pre> </div> </div> <p>假设你要执行一个一般的 WordPress 没有的复杂的数据库查询来加载首页的 posts。WordPress 提供了一个叫做 posts_results 的过滤器钩子使得你可以改变它。下面是 WordPress 核心中的代码:</p> <div> <div id="highlighter_463557" class="syntaxhighlighter php"> <pre><code class="language-php"><?php $this -> posts = apply_filters_ref_array( 'posts_results',array($this-> posts, &$this) ); ?></code></pre> </div> </div> <p>这个过滤器钩子向所有注册到它的过滤器传递一个 post 对象的数组。下面的例子,你完全重写这个 post 对象的数组并用自定义的内容代替。默认情况下,WordPress 查询 post 类型的 posts。下面改成查询 page 类型的 psots 并显示在首页。</p> <p>这段代码使用了 wpdb 类,在 part-6 “插件安全” 中将详细介绍。</p> <div> <div id="highlighter_606576" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'posts_result', 'boj_custom_home_page_posts'); function boj_cumstom_home_page_posts( $result ) { global$wpdb,$wp_query; /* 检查是否在首页 */ if( is_home() ) { /* 每页的 post 个数 */ $per_page= get_option('posts_per_page'); /* 得到当前页 */ $paged= get_query_var('paged'); /* 设置 $page 变量 */ $page= ( ( 0 ==$paged|| 1 ==$paged ) ? 1 : absint($paged ) ); /* 设置偏移的 posts 的个数 */ $offset= ($page- 1 ) * $per_page.','; /* 通过 $offset 和 要显示的 posts 数量来设置 limit */ $limits='LIMIT'.$offset.$per_page; /* 从数据库查询结果 */ $result=$wpdb-> get_results(" SELECT SQL_CALC_FOUND_ROWS$wpdb-> posts. * FROM$wpdb-> posts WHERE 1 = 1 AND post_type ='page' AND post_status ='publish' ORDER BY post_title ASC$limits" ); } return$result; } ?></code></pre> </div> </div> <h4>remove_filter</h4> <div> <div id="highlighter_406898" class="syntaxhighlighter php"> <pre><code class="language-php"><?php remove_filter( $tag, $function_to_remove,$priority,$accepted_args); ?></code></pre> </div> </div> <p>这和前面的 remove_action 类似。</p> <p>下面看看 WordPress 定义在 wp-includes/default-filters.php 页面中的默认的过滤器。其中一个有意思的过滤器叫做 wpautop(),它将双换行转换成 HTML 的 <p> </p>。这也就是我们在 HTML 发布内容时,直接回车便可在最终前端显示的时候换行的原因。它在核心代码中的几个钩子中都执行。下面是其中一个实例:</p> <div> <div id="highlighter_866470" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'the_content', 'wpautop'); ?></code></pre> </div> </div> <p>这将 wpautop() 过滤器应用到 post 的内容中,把每个换行都转换成段落( <p> )。但是也许有的客户不希望他的内容自动变成段落。那么你就可以使用 remove_filter() 函数从 the_content 钩子中删除这个过滤器。</p> <div> <div id="highlighter_287231" class="syntaxhighlighter php"> <pre><code class="language-php"><?php remove_filter( 'the_content', 'wpautop'); ?></code></pre> </div> </div> <p>因为在 add_filter 的时候没有定义优先级,所以这里也不需要。</p> <h4>remove_all_filters</h4> <p>和前面的remove_all_actions类似。</p> <div> <div id="highlighter_206690" class="syntaxhighlighter php"> <pre><code class="language-php"><?php remove_all_filters($tag,$priority); ?></code></pre> </div> </div> <p>has_filter</p> <p>和前面的 has_action 类似。</p> <h4>current_filter</h4> <p>同样类似于 did_action。不过它不仅仅对过滤器钩子有效,同样对动作钩子也有效,所以它返回的是当前的 action 或者 filter 钩子。这个函数在你对多个钩子使用单个函数,但是需要依赖不同的钩子执行不同的内容的时候非常的有用。例如,客户希望在 post 标题 和内容中限制一些内容,但是这两个限制的minganci的集合是不同的。使用 current_filter() 函数来根据钩子设置不同的minganci表就可以实现用一个函数同时过滤 the_content 和 the_title。使用下面的代码,你可以把minganci替换成**。</p> <div> <div id="highlighter_150391" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'the_content', 'boj_replace_unwanted_words'); add_filter( 'the_title', 'boj_replace_unwanted_words'); function boj_replace_unwanted_words( $text ) { /* 如果过滤器钩子是 the_content */ if('the_content'== current_filter() ) $words=array('min','gan','ci'); /* 如果钩子是 the_title */ elseif('the_title'== current_filter() ) $words=array('zhen','de','hen','min','gan'); /* 替换minganci */ $text=str_replace($words,'**',$text); return$text; } ?></code></pre> </div> </div> <h3>快速返回函数</h3> <p>你经常需要写一个函数返回一个常用的值给一个过滤器钩子,例如 true,false,或者一个空数组。你甚至尝试使用 PHP 的 create_function() 函数来快速返回一个值。</p> <p>WordPress 提供几个函数处理这种情况。</p> <p>下面是例子禁用了 user contact 方法 – 在 WordPress 的个人用户管理页面中的一系列 <input>。要禁用这些表单项,你需要返回一个空数组。通常,你必须添加过滤器钩子调用和函数。</p> <div> <div id="highlighter_42043" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'user_contactmethods', 'boj_return_empty_array' ); function boj_return_empty_array() { returnarray(); } ?></code></pre> </div> </div> <p>写这样的代码一两次并没什么。但是写一个返回空数组的函数太傻了。WordPress 使之简单化了。因为要禁用这些表单项,你只需要使用 WordPress 的 __return_empty_array() 函数作为过滤器来快速返回一个空数组。如下:</p> <div> <div id="highlighter_874481" class="syntaxhighlighter php"> <pre><code class="language-php">add_filter( 'user_contactmethods', '__return_empty_array' )</code></pre> </div> </div> <p>还有几个类似的快速返回函数:</p> <ul> <li>__return_false</li> <li>__return_true</li> <li>__return_zero</li> </ul><p>如果上面的函数不符合你的要求,你还可以创建自己的快速返回函数。</p> <h3>常用的过滤器钩子</h3> <p>WordPress 上百种过滤去钩子提供给插件开发者。下面介绍一些常用的过滤器钩子。</p> <h4>the_content</h4> <p><span style="color:rgb(255,0,0);font-weight:bold;">the_content 可以说是用的最多的过滤器钩子了。</span>没有内容,一个网站一点用处也没有。内容是一个网站上最重要的东子,插件使用这个钩子为网站添加许多特色。</p> <p>the_content 钩子向所有注册给它的过滤器传递一个 post 的内容。之后由过滤器来控制内容,通常添加一些格式化或者附加而外的一些信息。下面的例子根据 post 分类,当用户阅读一篇 post 时显示一个附加的相关 post 列表到 the_content。</p> <div> <div id="highlighter_85232" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'the_content', 'boj_add_related_posts_to_content'); function boj_add_related_posts_to_content( $content) { /* 如果不是单篇文章,直接返回 content */ if( !is_singular('post') ) return$content; /* 得到当前 post 的分类 */ $terms= get_the_terms( get_the_ID(),'category'); /* 循环分类,并将它们的 ID 放到一个数组中 */ $categories=array(); foreach($termsas$term ) $categories[] =$term-> term_id; /* 从数据库查询相同分类的 posts */ $loop=newWP_Query( array( 'cat__in'=>$categories, 'posts_per_page'=> 5, 'post__not_in'=>array( get_the_ID() ), 'orderby'=>'rand' ) ); /* 是否有相关 posts 存在 */ if($loop-> have_posts() ) { /* 开始 ul */ $content.='<ul class="related-posts">'; while($loop-> have_posts() { $loop-> the_post(); /* 添加 post 标题 */ $content.= the_title ( '<li><a href="'.get_permalink().'">', '</a></li>', false ); } /* 结束 ul */ $content.='</ul>'; /* 重置 query */ wp_reset_query(); } /* 返回 content */ $return$content; } ?></code></pre> </div> </div> <h4>the_title</h4> <p>文章的标题几乎和内容一样重要,所以 the_title 也是一个常用的过滤器钩子。你可以使用这个钩子添加信息,或者直接重写。</p> <p>应用给 the_title 钩子的一个有用的过滤器就是去除标题中 HTML 标签的过滤器函数。用户有时会添加一些标签到标题中,这可能会破坏正常的格式。使用下面的代码,你可以过滤掉所有用户可能添加到标签。</p> <div> <div id="highlighter_203692" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'the_title', 'boj_strip_tags_from_titles'); function boj_strip_tags_from_title( $title ) { $title=strip_tags($title); $return$title; } ?></code></pre> </div> </div> <h4>同样 comment_text 也很常用。</h4> <p>下面的例子中,检查一条评论是否是网站的注册用户发表的。如果是注册用户,你可以附加一段用户信息的说明( 详见:Part-8,”用户” )</p> <div> <div id="highlighter_265510" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'comment_text', 'boj_add_role_to_comment_text'); function boj_add_role_to_comment_text( $text ) { global$comment; /* 检查是否是注册用户 */ if($comment-> user_id > 0 ) { /* 新建一个用户对象 */ $user=newWP_User( $comment-> user_id ); /* 如果用户有一个角色,添加到评论内容中 */ if(is_array($user-> roles ) ) $text.='<p>User Role: '.$user-> roles[0]. '</p>'; } return$text; } ?></code></pre> </div> </div> <h4>template_include</h4> <p>template_include 是其他一些更特殊的过滤器钩子的一类”杂物包”( catchall )过滤器钩子。</p> <ul> <li>front_page_template</li> <li>home_template</li> <li>single_template</li> <li>page_template</li> <li>attachment_template</li> <li>archive_template</li> <li>category_template</li> <li>tag_template</li> <li>author_template</li> <li>date_template</li> <li>search_template</li> <li>404_template</li> <li>index_template</li> </ul><p>它用在 theme template 过滤器后面,当当前页被选中后。WordPress 根据读者当前浏览的页面来选择一个模板。你可以为每一个独立的过滤器钩子添加一个过滤器,也可以在最后使用 template_include 钩子一起过滤他们。</p> <p>比如你想按照你的插件的标准构造一个模板层级结构,而不是使用 WordPress 默认的模板层级。template_include 和上面列表中的钩子可以满足你。</p> <p>下面的例子中,根据分类判断一个 posts 的模板是否存在。默认情况下,WordPress 先检查 single.php,如果不存在,再检查 index.php文件。而你的函数查找一个叫做 single-category-$slug.php ( $slug 是分类的别名 )的文件。所以如果用户有一个叫 art 的分类,同时一个模板的名字叫做 single-category-art.php,那么这个文件会被用来代替 single.php。</p> <div> <div id="highlighter_601391" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'single_template', 'boj_single_template' ); function boj_single_template( $template ) { global$wp_query; /* 检查是否在浏览单个 post */ if( is_singular('post') ) { /* 获得 post ID */ $post_id=$wp_query-> get_queried_object_id(); /* 获得 post 的分类 */ $terms= get_the_terms($post_id,'category'); /* 循环分类,添加别名作为文件名的一部分 */ $template=array(); foreach($termsas$term ) $templates[] ="single-category-{$term->slug}.php"; /* 检查模板是否存在 */ $locate= locate_template($templates); /* 如果找到,让它成为新模板 */ if( !empty($locate) ) $template=$locate; } /* 换回模板文件名 */ return$template; } ?></code></pre> </div> </div> <h2>使用一个类中的钩子</h2> <p>前面已经讲了许多通过 PHP 函数来使用动作钩子和过滤器钩子的例子。在类中添加一个方法作为一个动作或者过滤器的时候,格式和 add_action() 和 add_filter() 略微有些不同。</p> <p>一般来说,插件使用函数而不是类中的方法作为动作或者过滤器。但是,可能有些时候使用类更适合,所以你要知道如何类在类中将方法注册到钩子。</p> <p>前面已经提到的注册函数到一个动作钩子的方法:</p> <div> <div id="highlighter_90945" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_action( $tag, $function_to_add); ?></code></pre> </div> </div> <p>当在类中将方法作为 $function_to_add 参数时,你必须把 $function_to_add 变成一个数组,其中 & $this 作为第一个参数,方法名作为第二个参数:</p> <div> <div id="highlighter_177374" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_action( $tag, array( &$this,$method_to_add) ); ?></code></pre> </div> </div> <p>对于过滤器钩子也是一样。一般的将函数添加到一个过滤器钩子类似于:</p> <div> <div id="highlighter_248128" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( $tag, $function_to_add); ?></code></pre> </div> </div> <p>当使用类的方法的时候,要改成:</p> <div> <div id="highlighter_744104" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( $tag, array( &$this,$method_to_add) ); ?></code></pre> </div> </div> <p>下面的例子中,创建了一个类,包含一个构造函数,一个作为动作的方法,和一个作为过滤器的方法。add_filters() 方法检查用户是否在浏览单篇 post。如果是 content() 方法附加最后的修改时间到 post 的内容中。</p> <div> <div id="highlighter_48128" class="syntaxhighlighter php"> <pre><code class="language-php"><?php class BOJ_My_Plugin_Loader { /* 类的构造函数 */ functionBOJ_My_Plugin_Loader() { /* 为 'template_redirect' 钩子添加 'singular_check' 方法 */ add_action('template_redirect',array( & $this,'singular_check') ); } /* 作为动作的方法 */ functionsingular_check() { /* 如果在看单个文章,过滤内容 */ if( is_singular() ) add_filter('the_content',array( & $this,'content') ); } /* 作为过滤器的方法 */ functioncontent($content) { /* 得到 post 的最后修改时间 */ $date= get_the_modified_time( get_option('date_format') ); /* 附加修改时间到 content */ $content.='<p> 最后修改于:'.$date.'</p>'; return$content; } } $boj_myplugin_loader=newBOJ_My_Plugin_Loader(); ?></code></pre> </div> </div> <h2>创建自定义钩子</h2> <p>插件不但可以使用内核的内置钩子,他们也可以创建自定义的钩子供其他插件和模板使用。</p> <p>插件可以使用4个可用函数中的一个来创建自定义钩子。</p> <ul> <li>do_action()</li> <li>do_action_ref_array()</li> <li>apply_filters()</li> <li>apply_filters_ref_array()</li> </ul><p>前两个创建自定义动作钩子,后两个创建自定义过滤器钩子。</p> <h3>创建自定义钩子的优点</h3> <p>自定义钩子使得你的插件更灵活,使其可以被其他插件扩展,让你可以钩到你的整个插件自己的其他执行过程中。</p> <p>使用自定义钩子还可以防止用户直接修改你的插件。这一点的重要性在于,当你更新你的插件时,用户不会失去他们修改的内容。</p> <h3>自定义动作钩子实例</h3> <p>在这个例子中,建立了一个插件安装函数。这个函数定义了一个可以更换的常量。别的插件也可以在这个钩子上执行任何代码。因为你在那一点上提供了钩子。</p> <div> <div id="highlighter_967106" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_action( 'plugins_loaded', 'boj_myplugin_setup' ); function boj_myplugin_setup() { /* 允许动作最先触发 */ do_action('boj_myplugin_setup_pre'); /* 检查 root slug 是否定义 */ if( !defined('BOJ_MYPLUGIN_ROOT_SLUG') ) define('BOJ_MYPLUGIN_ROOT_SLUG','articles'); } ?></code></pre> </div> </div> <p>其他插件或者模板可以钩到 boj_myplugin_setup_pre 来执行任何函数。</p> <p>比如你想把 BOJ_MYPLUGIN_ROOT_SLUG 常量从 ‘articles’ 改为 ‘papers’ ,你可以建立一个动作并添加到这个钩子中:</p> <div> <div id="highlighter_392053" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_action( 'boj_myplugin_setup_pre','boj_define_myplugin_constants'); function boj_define_myplugin_constants() { define('BOJ_MYPLUGIN_ROOT_SLUG','papers'); } ?></code></pre> </div> </div> <h3>自定义过滤器钩子实例</h3> <p>假设有一个函数显示一个具有一个特定阐述的文章列表。你也许希望其他人能够过滤那个参数或者过滤最终结果。</p> <p>下面的例子中,写一个函数根据收到的评论条数列取了前10的文章。这个函数让用户可以在从数据库获取数据前过滤这个参数,并且可以过滤最终输出的 HTML 列表。</p> <div> <div id="highlighter_596421" class="syntaxhighlighter php"> <pre><code class="language-php"><?php function boj_posts_by_comments() { /* 默认参数 */ $args=array( 'post_type'=>'post', 'posts_per_page'=> 10, 'order'=>'DESC', 'oerderby'=>'comment_count' ); /* 应用过滤器 */ $args= apply_filters('boj_posts_by_comments_args',$args); /* 设置输出变量 */ $out=''; /* 由给定的参数从数据库查询文章 */ $loop=newWP_Query( $args ); /* 检查是否返回结果 */ if($loop-> have_posts() ) { $out.='<ul class="posts-by-comments" >'; while($loop-> have_posts() ) { $loop-> the_post(); $out.= the_title('<li>','</li>', false ); } $out.='</ul>'; } $out= apply_filters('boj_posts_by_comments',$out); echo$out; } ?></code></pre> </div> </div> <p>要过滤参数,给 boj_posts_by_comments_args 添加一个过滤器。比如你希望把数量从默认的10变成15,添加下面的过滤器:</p> <div> <div id="highlighter_846216" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'boj_posts_by_comments_args','boj_change_posts_by_comments_args'); function boj_change_posts_by_comments_args( $args) { $args['posts_per_page'] = 15; return$args; } ?></code></pre> </div> </div> <p>要过滤最后的 HTML 输出,添加一个过滤器到 boj_posts_by_comments。比如你想把 ul 改成 ol。</p> <div> <div id="highlighter_665735" class="syntaxhighlighter php"> <pre><code class="language-php"><?php add_filter( 'boj_posts_by_comments', 'boj_change_posts_by_comments' ); function boj_change_posts_by_comments( $out ) { $out=str_replace('<ul','<ol',$out); $out=str_replace('</ul>','</ol>',$out); return$out; } ?></code></pre> </div> </div> <h2>上哪找钩子?</h2> <p>要给出 WordPress 中所有钩子的列表几乎是不可能的。前面我们讨论了一些常用的动作和过滤器钩子,这一节仅仅讨论一小部分 WordPress 提供的钩子。</p> <p>WordPress 的新版本会加入新的钩子。最终查看不同版本的内核可以让你找到可以用在插件中的新钩子。</p> <h3>在内核中搜索钩子</h3> <p>作为一个插件开发这,你应该熟悉 WordPress 的内核。寻找钩子能很好的帮助你熟悉 WordPress 内核是如何工作的。没有更好的方法来搞明白 PHP 代码在内核中是如何工作的了。</p> <p>要寻找钩子的一个简单的方法是在编辑器中打开一个 WordPress 文件然后搜索下面的四个词:</p> <ul> <li>do_action</li> <li>do_action_ref_array</li> <li>apply_filters</li> <li>apply_filters_ref_array</li> </ul><p>这四个函数,每一个都创建一个钩子。</p> <h3>变量钩子</h3> <p>在 WordPress 的内核中找钩子的时候,你会遇到变量钩子。通常钩子的名字是一个静态的字符串。但是变量钩子的名字跟着特定的变量而改变。</p> <p>一个很好的例子就是 load-$pagenow 动作钩子。变量 $pagenow 根据 WordPress 中当前浏览的 admin 页面而改变。这个钩子如下:</p> <div> <div id="highlighter_178877" class="syntaxhighlighter php"> <pre><code class="language-php"><?php do_action( "load-$pagenow" ); ?></code></pre> <br> </div> </div> <p>变量 $pagenow 会变成当前访问页面的名字。例如 new post 页面的钩子是 load-post-new.php,而编辑页面的是 load-post.php。这就使得插件仅仅对特定的 admin 页面执行代码。WordPress 有几个动作和过滤器钩子的名称里面是含有变量的。</p> <p>通常,这些钩子的名字变成给定的内容,使得插件开发者可以在特定的环境下执行代码。</p> <h3>钩子参考列表</h3> <p>虽然在核心里面搜索钩子有助于你增长经验,但是有时你需要一些网上的参考列表。</p> <p>WordPress 在 Codex 中有官方的钩子参考列表。</p> <ul> <li>http://codex.wordpress.org/Plugin_API/Action_Reference</li> <li>http://codex.wordpress.org/Plugin_API/Filter_Reference</li> </ul><p>在 Part-18,开发人员工具箱,将介绍更多帮助插件开发者的工具。</p> <h2>总结</h2> <p>钩子是创建 WordPress 插件的最重要的一环了。每次你开始创建一个插件,你都要把你的插件钩到 WordPress 的动作钩子和过滤器钩子中。钩子是插件开发中必不可少的工具。在了解了钩子之后,就是时候开始创建插件了。</p> </li> </ul> <br> <div></div> <div></div> <div></div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1294301690194894848"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(WordPress)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835434126874865664.htm" title="ubuntu安装wordpress" target="_blank">ubuntu安装wordpress</a> <span class="text-muted">lissettecarlr</span> <div>1安装nginx网上安装方式很多,这就就直接用apt-get了apt-getinstallnginx不用启动啥,然后直接在浏览器里面输入IP:80就能看到nginx的主页了。如果修改了一些配置可以使用下列命令重启一下systemctlrestartnginx.service2安装mysql输入安装前也可以更新一下软件源,在安装过程中将会让你输入数据库的密码。sudoapt-getinstallmy</div> </li> <li><a href="/article/1834989767712927744.htm" title="【漏洞分享】2018年-2024年HVV 6000+个漏洞 POC 合集分享" target="_blank">【漏洞分享】2018年-2024年HVV 6000+个漏洞 POC 合集分享</a> <span class="text-muted">漏洞文库-Web安全</span> <a class="tag" taget="_blank" href="/search/%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/1.htm">漏洞复现</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a> <div>此份poc集成了Zabbix、用友、通达、Wordpress、Thinkcmf、Weblogic、Tomcat等下载链接:链接:https://pan.quark.cn/s/1cd7d8607b8a</div> </li> <li><a href="/article/1834967570235617280.htm" title="【漏洞利用】2018年-2024年HVV 6000+个漏洞 POC 合集分享" target="_blank">【漏洞利用】2018年-2024年HVV 6000+个漏洞 POC 合集分享</a> <span class="text-muted">baiolkdnhjaio</span> <a class="tag" taget="_blank" href="/search/%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/1.htm">漏洞复现</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>此份poc集成了Zabbix、用友、通达、Wordpress、Thinkcmf、Weblogic、Tomcat等下载链接:链接:https://pan.quark.cn/s/1cd7d8607b8a</div> </li> <li><a href="/article/1834825627467870208.htm" title="华纳云:修复WordPress内存耗尽错误的常用方法有哪些?" target="_blank">华纳云:修复WordPress内存耗尽错误的常用方法有哪些?</a> <span class="text-muted">华纳云IDC服务商</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/WordPress/1.htm">WordPress</a> <div>WordPress内存耗尽错误通常是由于PHP内存限制不足导致的。修复这种错误的方法有多种,以下是几种常用的方法:1.修改wp-config.php文件在WordPress根目录的wp-config.php文件中添加或修改以下代码,增加PHP的内存限制:define('WP_MEMORY_LIMIT','256M');将256M替换为所需的内存值。例如,可以将其设置为128M,256M,512M等</div> </li> <li><a href="/article/1834608731044802560.htm" title="CVE-2020-24186 WordPress评论插件wpDiscuz任意文件上传漏洞" target="_blank">CVE-2020-24186 WordPress评论插件wpDiscuz任意文件上传漏洞</a> <span class="text-muted">sukusec</span> <div>0x00漏洞介绍Wordfence的威胁情报团队在一款名叫wpDiscuz的Wordpress评论插件(wpDiscuz是WordPress功能丰富的评论系统插件,可充实网站评论部分)中发现了一个高危漏洞,此漏洞将允许未经认证的攻击者在目标站点中上传任意文件,从而实现远程代码执行。0x01漏洞环境WordPress的gVectorswpDiscuz插件7.0至7.0.4版本中存在远程代码执行漏洞,</div> </li> <li><a href="/article/1833435770929639424.htm" title="推荐使用:Models——简化WordPress自定义类型的高效工具" target="_blank">推荐使用:Models——简化WordPress自定义类型的高效工具</a> <span class="text-muted">郦祺嫒Amiable</span> <div>推荐使用:Models——简化WordPress自定义类型的高效工具modelsWordPressplugintocreatecustomposttypesandtaxonomiesusingJSON,YAMLorPHPfiles项目地址:https://gitcode.com/gh_mirrors/models7/models在追求灵活和定制化的Web开发道路上,WordPress凭借其强大的社</div> </li> <li><a href="/article/1833379388381556736.htm" title="如何将wordpress网站做成微信小程序(我的第一款微信小程序)" target="_blank">如何将wordpress网站做成微信小程序(我的第一款微信小程序)</a> <span class="text-muted">shuihan198712</span> <div>01作品信息作品名称:Axure技术小站作品类型:微信小程序开发日期:2019-07-25目前状态:刚开始,还在开发,上线时间未知02背景1、之前在做wordpress微信支付时候,偶尔发现了一篇,将wordpress网站做成微信小程序的文章。2、微信小程序这么火3、学习一下,了解下小程序开发的一些知识03准备工作1、个人知识储备:我没有相关的代码经验,之前稍微接触过一点点,零零散散,不足以独立写</div> </li> <li><a href="/article/1833347550384582656.htm" title="WordPress website building technology service providers" target="_blank">WordPress website building technology service providers</a> <span class="text-muted">podoor</span> <a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a><a class="tag" taget="_blank" href="/search/woocommerce/1.htm">woocommerce</a> <div>Top10WordPresswebsitebuildingcompaniesinChina,WordPresswebsitebuildingtechnologyserviceprovidersJianzhanpress.comWordPressThemeJianzhanisaplatformdedicatedtoWordPressthemedevelopment,providingavariety</div> </li> <li><a href="/article/1833261192018227200.htm" title="wordpress做后台的资讯类小程序源码" target="_blank">wordpress做后台的资讯类小程序源码</a> <span class="text-muted">北漂的老猿</span> <a class="tag" taget="_blank" href="/search/%E5%A5%BD%E4%BB%A3%E7%A0%81/1.htm">好代码</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a> <div>WordPress博客系统资讯资源变现下载小程序源码。这个就比较牛逼了,直接用wordpress做后台因为由于微信的新规从2022-11月9号后新上线的小程序将不能获取用户头像和名字了所以微信放需要适配全新的,支持让用户自定义头像和昵称了不然统一返回默认头像和显示(微信用户)另外还有一些新增和优化的地方就不多做介绍了大家自行的去研究探索吧!代码下载</div> </li> <li><a href="/article/1833027871740882944.htm" title="从零开始搭建WordPress个人网站" target="_blank">从零开始搭建WordPress个人网站</a> <span class="text-muted">zhaoolee</span> <div>imageimageimageimageimageimage文字版查看下一篇推送设置轻量应用服务器•初始化轻量应用服务器,设置登录密码比如iamzhaoolee•将域名hk.v2fy.com解析到轻量应用服务器的ip•确认开启轻量应用服务器的80端口,63306端口,待会儿要用ssh登录到服务器#查看路径下载wgethttps://wordpress.org/wordpress-5.3.tar.g</div> </li> <li><a href="/article/1832985059469127680.htm" title="mysql 新增管理员_操作MYSQL数据库给WordPress增加新的管理员账号" target="_blank">mysql 新增管理员_操作MYSQL数据库给WordPress增加新的管理员账号</a> <span class="text-muted">仙剑李逍遥</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E5%A2%9E%E7%AE%A1%E7%90%86%E5%91%98/1.htm">新增管理员</a> <div>网页制作网络技术需要大家共同分享,不能闭门造车,下面是bj-dns文章简介:如何手工给wordpress增加一个管理员帐号。首先,我先设定数据库已经存在了wordpress的表,下面就是操作了。首先我们来到PHPMyAdmin界面。我们主要要操作wp_users和wp_usermeta表。首先操作wp_users表增加一个用户选中wp_users表并且点击界面上的插入按钮(在上面一排操作的中间偏后</div> </li> <li><a href="/article/1832408414924402688.htm" title="WordPress的安装与简单开发教程" target="_blank">WordPress的安装与简单开发教程</a> <span class="text-muted">CopyLower</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/Wordpress/1.htm">Wordpress</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a> <div>WordPress是目前世界上最受欢迎的开源内容管理系统(CMS),它以简便易用、扩展性强和庞大的生态系统著称。通过它,你可以轻松构建博客、企业网站、电子商务平台等多种类型的网站。本文将为你介绍WordPress的安装过程,以及如何进行简单的开发。第一部分:WordPress的安装1.1.安装前的准备在安装WordPress之前,你需要准备以下环境:Web服务器:如Apache、Nginx等。PH</div> </li> <li><a href="/article/1832080270346514432.htm" title="推荐开源项目:WP-Player - 强大的WordPress音频与视频播放器" target="_blank">推荐开源项目:WP-Player - 强大的WordPress音频与视频播放器</a> <span class="text-muted">邹澜鹤Gardener</span> <div>推荐开源项目:WP-Player-强大的WordPress音频与视频播放器是一个专为WordPress设计的高效、灵活且功能丰富的多媒体播放器插件。它允许你在博客、新闻网站或其他基于WordPress的内容平台上无缝集成音频和视频内容,提供一流的用户体验。技术分析1.响应式设计WP-Player采用现代Web开发原则,支持响应式布局,无论在桌面、平板还是手机等不同设备上,都能自动调整以适应屏幕大小</div> </li> <li><a href="/article/1832062882276274176.htm" title="通过 Docker 部署 WordPress 服务器" target="_blank">通过 Docker 部署 WordPress 服务器</a> <span class="text-muted">shelby_loo</span> <a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>今天我们将在阿贝云的免费服务器上进行WordPress的部署测试。阿贝云的免费云服务器配置简直是个宝藏,1核CPU、1GB内存、10GB硬盘和5M带宽,真是不错的免费服务器,适合轻量级应用和学习项目。无论你是开发者还是爱好者,阿贝云都能给你提供一个稳定的环境,帮助你快速上手。Docker和WordPress简介Docker是一个开源平台,允许开发者将应用程序及其依赖打包到一个可移植的容器中。通过容</div> </li> <li><a href="/article/1831588745179131904.htm" title="WordPress自适应美图网站整站打包源码" target="_blank">WordPress自适应美图网站整站打包源码</a> <span class="text-muted">北漂的老猿</span> <a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81%E5%90%A7/1.htm">代码吧</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a><a class="tag" taget="_blank" href="/search/ripro/1.htm">ripro</a> <div>直接服务器整站源码+数据库打包了,恢复一下就可以直接投入使用。保证好用易用,无需独立服务器就可以使用。强调一下,我这个和其他地方的不一样、不一样、不一样。具体的看下面的说明。现在网络上同样的资源包都是用的加密带后门的主题,需要安装php加密组件才能使用,同时也有后门。本站这个是全部开源无后门,无需安装加密组件,任意一个支持php的虚拟主机都可以使用了。另外原来的数据库里的图片地址都是写死了url的</div> </li> <li><a href="/article/1831394988940947456.htm" title="2024 WordPress资源展示下载类主题源码开心版" target="_blank">2024 WordPress资源展示下载类主题源码开心版</a> <span class="text-muted">会说源码</span> <a class="tag" taget="_blank" href="/search/%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86/1.htm">源代码管理</a> <div>简介:WordPress 资源展示型下载类主题 CeoMax-Pro_v7.6开心版;CeoMax-Pro是一款极致美观强大的WordPress付费资源下载主题,它能满足您所有付费资源下载的业务需求!你的想法与业务不能被主题所限制!CeoMax-Pro强大的功能,在不久的将来它能实现你一切幻想!我们也在为此而不断努力。适用于资源站、下载站、交易站、素材站、源码站、课程站、CMS</div> </li> <li><a href="/article/1830454932680044544.htm" title="WordPress 后台缓存插件:WP Admin Cache提高缓存页面" target="_blank">WordPress 后台缓存插件:WP Admin Cache提高缓存页面</a> <span class="text-muted">818源码资源站</span> <a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E4%B8%8B%E8%BD%BD00818.cn/1.htm">源码下载00818.cn</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E4%B8%8B%E8%BD%BD818%E8%B5%84%E6%BA%90%E7%AB%99/1.htm">源码下载818资源站</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>使用WordPress建站会安装一些静态缓存插件,比如:WPRocket、CacheEnabler、CometCache、W3TotalCache、WPSuperCache、WPFastestCache、HyperCache等等,这些都用于缓存前端。今天介绍一款专门用于缓存后台的插件:WPAdminCache。启用后,提速效果还是很明显,比如后台所有文章页面秒开。缓存会在更新文章、保存设置、保存小</div> </li> <li><a href="/article/1830381315602608128.htm" title="Puock基于WordPress开发的高颜值的自适应主题 支持白天与黑夜模式v2.8.4" target="_blank">Puock基于WordPress开发的高颜值的自适应主题 支持白天与黑夜模式v2.8.4</a> <span class="text-muted">专业软件系统开发</span> <a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E4%B8%8B%E8%BD%BD/1.htm">源码下载</a><a class="tag" taget="_blank" href="/search/wordpress%E4%B8%BB%E9%A2%98/1.htm">wordpress主题</a> <div>内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍WordPress管理后台中的「外观」-「主题」中点击「添加」,选择Puock的主题包进行上传安装并启用即可。提示:为了防止主题不兼容,请在安装主题前进行数据备份,防止数据字段重复覆盖等情况发生。环境要求WordPress>=6.0,PHP>=7.4主题特性支持白天与暗黑模式全局无刷新加载支持博客、CMS、企业三</div> </li> <li><a href="/article/1830362637813248000.htm" title="如何降级 WordPress 到旧版本" target="_blank">如何降级 WordPress 到旧版本</a> <span class="text-muted">Linux大师</span> <div>|我们都知道,每当WordPress有新本的时候,我们都可以在后台一键更新。但是有些时候,我们的主题或插件可能不兼容新版本的WP,这时候我们如果要降级为之前的旧版本,该怎么操作呢?下面一起来看看。|手动降级1.下载对应的WordPress旧版本下载你目前使用的语言版本(即如果你使用官方中文版,就下载官方中文的旧版本,如果是英文原版,就下载英文旧版本)WordPress官方中文版各版本下载地址:ht</div> </li> <li><a href="/article/1830245188333826048.htm" title="【网络安全】WordPress Uncontrolled Resource Consumption" target="_blank">【网络安全】WordPress Uncontrolled Resource Consumption</a> <span class="text-muted">秋说</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E6%BC%8F%E6%B4%9E%E6%8C%96%E6%8E%98/1.htm">漏洞挖掘</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a> <div>未经许可,不得转载。文章目录WordPresswp-cron.php实战漏洞危害解决措施WordPressWordPress是全球最广泛使用的内容管理系统(CMS),目前约有43%的网站依赖于它。由于其用户友好的界面和丰富的插件功能,WordPress成为了全球最受欢迎的CMS。然而,在使用WordPress的过程中,用户常常忽视一些潜在的配置问题,其中之一就是wp-cron.php文件的设置。w</div> </li> <li><a href="/article/1830164255660404736.htm" title="wordpress跨境电商外贸独立站 常见获取流量方式" target="_blank">wordpress跨境电商外贸独立站 常见获取流量方式</a> <span class="text-muted">podoor</span> <a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a> <div>在建立跨境电商外贸独立站时,获取流量的方法有很多种,以下是一些常见的方法:社交媒体营销:通过发布有吸引力的内容在Facebook、Instagram、Twitter等平台上。电子邮件营销:通过向潜在客户发送定制的电子邮件,包含特别优惠或新产品信息。搜索引擎优化(SEO):提高网站在搜索引擎中的排名,以吸引更多的访问者。付费广告:在GoogleAdWords、FacebookAds或其他广告平台上投</div> </li> <li><a href="/article/1830078294108762112.htm" title="Atlas阿特拉斯wordpress主题" target="_blank">Atlas阿特拉斯wordpress主题</a> <span class="text-muted">podoor</span> <a class="tag" taget="_blank" href="/search/wordpress%E6%A8%A1%E6%9D%BF/1.htm">wordpress模板</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a> <div>Atlas阿特拉斯是一个专为WordPress平台设计的多功能主题,该主题由简站wordpress主题开发,旨在为用户提供一个强大而灵活的工具,以构建各种类型的网站。以下是对Atlas阿特拉斯WordPress主题的简介:Atlas阿特拉斯WordPress主题简介:Atlas阿特拉斯以其创新的设计和强大的功能集,为WordPress用户提供了一个全面的主题解决方案。无论是企业网站、B2C独立站、</div> </li> <li><a href="/article/1830059002625617920.htm" title="wordpress在北美华人中的使用情况分析" target="_blank">wordpress在北美华人中的使用情况分析</a> <span class="text-muted">podoor</span> <a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a> <div>WordPress是一个全球广泛使用的开源内容管理系统(CMS),它以其灵活性、易用性和强大的插件生态系统而闻名。在北美华人社区中,WordPress同样受到许多个人和企业的青睐。以下是对WordPress在北美华人中的使用情况的分析:1.语言和文化适应性WordPress支持多语言,这使得它能够很好地适应北美华人社区的需求。许多华人用户选择使用中文或其他语言来创建和维护他们的网站,WordPre</div> </li> <li><a href="/article/1829791636863938560.htm" title="wordpress网站静态缓存插件之WP-Super-Cache详细安装与配置说明教程" target="_blank">wordpress网站静态缓存插件之WP-Super-Cache详细安装与配置说明教程</a> <span class="text-muted">Alextao_0a86</span> <div>关于WP-Super-Cache教程网上有很多,但大多质量不高无实际作用,今天转载一篇个人认为比较不错的文章。原文地址:http://blog.az009.com/15209.html一、安装插件首先,到wordpress后台插件项中点击安装插件列表里面搜索“WPSuperCache”,第一个即是安装即可。二、详细配置安装好WP-Super-Cache并启用后到Settings选项中进行设置,具体</div> </li> <li><a href="/article/1829057979652075520.htm" title="Ubuntu 24.04部署Wordpress" target="_blank">Ubuntu 24.04部署Wordpress</a> <span class="text-muted">idiot_qi</span> <a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96%E5%B7%A5%E5%85%B7/1.htm">其他工具</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a> <div>环境:Ubuntu24.04PHP8.1.2-1ubuntu2.18Nginx/1.18.0(Ubuntu)WordPress6.6.1Mysql8文章目录1.安装php2.配置nginx2.1.安装nginx2.2.配置3.下载wordpress3.1.配置wordpress4.mysql配置wordpress数据库和用户4.1.安装和远程连接4.2.创建wordpress数据库和用户5.访问w</div> </li> <li><a href="/article/1829056844639858688.htm" title="WordPress自定义文件上传路径的方法" target="_blank">WordPress自定义文件上传路径的方法</a> <span class="text-muted">程序小小生</span> <a class="tag" taget="_blank" href="/search/WordPress/1.htm">WordPress</a><a class="tag" taget="_blank" href="/search/WordPress%E4%B8%8A%E4%BC%A0%E8%B7%AF%E5%BE%84/1.htm">WordPress上传路径</a><a class="tag" taget="_blank" href="/search/WordPress%E8%87%AA%E5%AE%9A%E4%B9%89%E8%B7%AF%E5%BE%84/1.htm">WordPress自定义路径</a><a class="tag" taget="_blank" href="/search/WordPress/1.htm">WordPress</a><a class="tag" taget="_blank" href="/search/WordPress%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B/1.htm">WordPress上传文件类型</a><a class="tag" taget="_blank" href="/search/WordPress%E4%B8%8A%E4%BC%A0/1.htm">WordPress上传</a> <div>自WordPress3.5版本开始,隐藏了后台媒体设置页面的“默认上传路径和文件的完整URL地址”选项,可以通过下面的代码将该选项调出来。WordPress自定义文件上传路径的方法。将下面的代码添加到当前主题functions.php文件中,就可以调出该选项:if(get_option('upload_path')=='wp-content/uploads' || get_option('uplo</div> </li> <li><a href="/article/1828858919523545088.htm" title="wordpress图片主题" target="_blank">wordpress图片主题</a> <span class="text-muted">北漂的老猿</span> <a class="tag" taget="_blank" href="/search/%E5%A5%BD%E4%BB%A3%E7%A0%81/1.htm">好代码</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E7%89%87%E4%B8%BB%E9%A2%98/1.htm">图片主题</a> <div>源码介绍原版主题源码是一款仿d音模式套图SEO源码,wordpress图片主题不送数据,此源码为wordpress模板,需先安装wordpress后才能使用!!注意:PHP版本越高越好,PHP必须安装SG11扩展代码下载</div> </li> <li><a href="/article/1828344474858778624.htm" title="Kubernetes(k8s)中部署WordPress" target="_blank">Kubernetes(k8s)中部署WordPress</a> <span class="text-muted">条纹布鲁斯</span> <a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>在Kubernetes(k8s)中部署WordPress通常涉及创建一个Deployment来管理WordPress的Pod,以及一个Service来暴露WordPress应用。此外,由于WordPress需要数据库支持,你还需要部署一个MySQL或MariaDB的Pod和Service。以下是一个基本的示例,展示了如何使用YAML文件在Kubernetes中部署WordPress和MySQL。M</div> </li> <li><a href="/article/1827824598012489728.htm" title="WordPress禁止后台自定义功能" target="_blank">WordPress禁止后台自定义功能</a> <span class="text-muted">podoor</span> <a class="tag" taget="_blank" href="/search/WordPress%E6%8A%80%E6%9C%AF/1.htm">WordPress技术</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a> <div>wordpress后台可以彻底禁止主题的自定义菜单功能,下面这段代码添加到functions.php文件中,后台外观菜单中的”自定义”就会消失不见了。add_filter('map_meta_cap',function($caps,$cap){if($cap=='customize'){return['do_not_allow'];}return$caps;},10,2);小代码解决大问题,你学废</div> </li> <li><a href="/article/1827693195941736448.htm" title="阿里云轻量应用服务器多少钱?2核2G券后402元,2核4G券后574元" target="_blank">阿里云轻量应用服务器多少钱?2核2G券后402元,2核4G券后574元</a> <span class="text-muted">阿里云最新优惠和活动汇总</span> <div>阿里云轻量应用服务器多少钱?购买轻量应用服务器的用户一般都是个人和普通企业级用户,2核2G和2核4G配置的轻量应用服务器既能用于网站搭建,又可以满足学习、搭建应用等场景的需求,目前这款2核2G配置的阿里云轻量应用服务器券后最低报价为402元/年,2核4G券后最低报价为574元。我们都知道,阿里云轻量应用服务器最大的优势是自带WordPress、LAMP、Docker、DevStudio和Node.</div> </li> <li><a href="/article/80.htm" title="java杨辉三角" target="_blank">java杨辉三角</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java%E5%9F%BA%E7%A1%80/1.htm">java基础</a> <div> package com.algorithm; /** * @Description 杨辉三角 * @author FuJianyong * 2015-1-22上午10:10:59 */ public class YangHui { public static void main(String[] args) { //初始化二维数组长度 int[][] y</div> </li> <li><a href="/article/207.htm" title="《大话重构》之大布局的辛酸历史" target="_blank">《大话重构》之大布局的辛酸历史</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a> <div>《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。   背景         公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中</div> </li> <li><a href="/article/334.htm" title="电驴链接在线视频播放源码" target="_blank">电驴链接在线视频播放源码</a> <span class="text-muted">dubinwei</span> <a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E9%A9%B4/1.htm">电驴</a><a class="tag" taget="_blank" href="/search/%E6%92%AD%E6%94%BE%E5%99%A8/1.htm">播放器</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91/1.htm">视频</a><a class="tag" taget="_blank" href="/search/ed2k/1.htm">ed2k</a> <div>本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网: http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。 项目源码: http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。 项目源码依赖于两个库项目,库项目一链接: http://git.oschina.</div> </li> <li><a href="/article/461.htm" title="Javascript中函数的toString()方法" target="_blank">Javascript中函数的toString()方法</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/toString/1.htm">toString</a><a class="tag" taget="_blank" href="/search/function/1.htm">function</a><a class="tag" taget="_blank" href="/search/object/1.htm">object</a> <div>简述     The toString() method returns a string representing the source code of the function.     简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。 句法     function.</div> </li> <li><a href="/article/588.htm" title="struts处理自定义异常" target="_blank">struts处理自定义异常</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a> <div>很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。 非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。 此处我们用的是非运行时异常,首先定义一个异常LoginException: /** * 类描述:登录相</div> </li> <li><a href="/article/715.htm" title="Linux中find常见用法示例" target="_blank">Linux中find常见用法示例</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数;</div> </li> <li><a href="/article/842.htm" title="SpringMVC的各种参数绑定方式" target="_blank">SpringMVC的各种参数绑定方式</a> <span class="text-muted">Harry642</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a><a class="tag" taget="_blank" href="/search/%E7%BB%91%E5%AE%9A/1.htm">绑定</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E5%8D%95/1.htm">表单</a> <div>1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int count) { } 表单代码: <form action="saysth.do" method="post&q</div> </li> <li><a href="/article/969.htm" title="Java 获取Oracle ROWID" target="_blank">Java 获取Oracle ROWID</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div> A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row. The oracle.sql.ROWID class i</div> </li> <li><a href="/article/1096.htm" title="java获取方法的参数名" target="_blank">java获取方法的参数名</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/parameter/1.htm">parameter</a><a class="tag" taget="_blank" href="/search/method/1.htm">method</a><a class="tag" taget="_blank" href="/search/reflect/1.htm">reflect</a> <div>reflect.ClassInformationUtil.java package reflect; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifier; import javassist.bytecode.CodeAtt</div> </li> <li><a href="/article/1223.htm" title="JAVA正则表达式匹配 查找 替换 提取操作" target="_blank">JAVA正则表达式匹配 查找 替换 提取操作</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/%E6%9B%BF%E6%8D%A2/1.htm">替换</a><a class="tag" taget="_blank" href="/search/%E6%8F%90%E5%8F%96/1.htm">提取</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E6%89%BE/1.htm">查找</a> <div>正则表达式的查找;主要是用到String类中的split();       String str;      str.split();方法中传入按照什么规则截取,返回一个String数组   常见的截取规则: str.split("\\.")按照.来截取 str.</div> </li> <li><a href="/article/1350.htm" title="Java中equals()与hashCode()方法详解" target="_blank">Java中equals()与hashCode()方法详解</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/set/1.htm">set</a><a class="tag" taget="_blank" href="/search/equals%28%29/1.htm">equals()</a><a class="tag" taget="_blank" href="/search/hashCode%28%29/1.htm">hashCode()</a> <div>一.equals()方法详解     equals()方法在object类中定义如下:  public boolean equals(Object obj) { return (this == obj); }    很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I</div> </li> <li><a href="/article/1477.htm" title="精通Oracle10编程SQL(4)使用SQL语句" target="_blank">精通Oracle10编程SQL(4)使用SQL语句</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>--工资级别表 create table SALGRADE ( GRADE NUMBER(10), LOSAL NUMBER(10,2), HISAL NUMBER(10,2) ) insert into SALGRADE values(1,0,100); insert into SALGRADE values(2,100,200); inser</div> </li> <li><a href="/article/1604.htm" title="【Nginx二】Nginx作为静态文件HTTP服务器" target="_blank">【Nginx二】Nginx作为静态文件HTTP服务器</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/HTTP%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">HTTP服务器</a> <div> Nginx作为静态文件HTTP服务器 在本地系统中创建/data/www目录,存放html文件(包括index.html) 创建/data/images目录,存放imags图片 在主配置文件中添加http指令   http { server { listen 80; server_name </div> </li> <li><a href="/article/1731.htm" title="kafka获得最新partition offset" target="_blank">kafka获得最新partition offset</a> <span class="text-muted">blackproof</span> <a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/partition/1.htm">partition</a><a class="tag" taget="_blank" href="/search/offset/1.htm">offset</a><a class="tag" taget="_blank" href="/search/%E6%9C%80%E6%96%B0/1.htm">最新</a> <div>kafka获得partition下标,需要用到kafka的simpleconsumer   import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.</div> </li> <li><a href="/article/1858.htm" title="centos 7安装docker两种方式" target="_blank">centos 7安装docker两种方式</a> <span class="text-muted">ronin47</span> <div>      第一种是采用yum 方式              yum install -y docker           </div> </li> <li><a href="/article/1985.htm" title="java-60-在O(1)时间删除链表结点" target="_blank">java-60-在O(1)时间删除链表结点</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class DeleteNode_O1_Time { /** * Q 60 在O(1)时间删除链表结点 * 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点 * * Assume the list is: * head->...->nodeToDelete->mNode->nNode->..</div> </li> <li><a href="/article/2112.htm" title="nginx利用proxy_cache来缓存文件" target="_blank">nginx利用proxy_cache来缓存文件</a> <span class="text-muted">cfyme</span> <a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a> <div>user  zhangy users; worker_processes 10; error_log  /var/vlogs/nginx_error.log  crit; pid        /var/vlogs/nginx.pid; #Specifies the value for ma</div> </li> <li><a href="/article/2239.htm" title="[JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题" target="_blank">[JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a> <div>     假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:     string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"     定义一个0整数c,然后用这个整数c去</div> </li> <li><a href="/article/2366.htm" title="如何集成支付宝官方文档" target="_blank">如何集成支付宝官方文档</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>官方文档下载地址 https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash 集成的必要条件 1. 需要有自己的Server接收支付宝的消息 2. 需要先制作app,然后提交支付宝审核,通过后才能集成 调试的时候估计会真的扣款,请注意 </div> </li> <li><a href="/article/2493.htm" title="应该在什么时候使用Hadoop" target="_blank">应该在什么时候使用Hadoop</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html 存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。 --------------------------------------------万能的分割线-------------------------------- 有人问我,“你在大数据和Hado</div> </li> <li><a href="/article/2620.htm" title="在GridView中对于有外键的字段使用关联模型进行搜索和排序" target="_blank">在GridView中对于有外键的字段使用关联模型进行搜索和排序</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>在GridView中使用关联模型进行搜索和排序 首先我们有两个模型它们直接有关联: class Author extends CActiveRecord { ... } class Post extends CActiveRecord { ... function relations() { return array( '</div> </li> <li><a href="/article/2747.htm" title="使用NSString 的格式化大全" target="_blank">使用NSString 的格式化大全</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Objective-C/1.htm">Objective-C</a> <div>格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c</div> </li> <li><a href="/article/2874.htm" title="使用activeX插件对象object滚动有重影" target="_blank">使用activeX插件对象object滚动有重影</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/activeX%E6%8F%92%E4%BB%B6/1.htm">activeX插件</a><a class="tag" taget="_blank" href="/search/%E6%BB%9A%E5%8A%A8%E6%9C%89%E9%87%8D%E5%BD%B1/1.htm">滚动有重影</a> <div>  使用activeX插件对象object滚动有重影   <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#</div> </li> <li><a href="/article/3001.htm" title="SpringMVC4零配置" target="_blank">SpringMVC4零配置</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/springmvc4/1.htm">springmvc4</a> <div>基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。     项目说明如下: 1.db.sql是项目中用到的表,数据库使用的是oracle11g 2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动; 3.默认项目为零配置启动,如果需要更改启动方式,请</div> </li> <li><a href="/article/3128.htm" title="《开源框架那点事儿16》:缓存相关代码的演变" target="_blank">《开源框架那点事儿16》:缓存相关代码的演变</a> <span class="text-muted">j2eetop</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6/1.htm">开源框架</a> <div>问题引入 上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。 该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。 当然去看相关实现代代码的时候,大致是下面的样子。 [java] view plain copy print ? public vo</div> </li> <li><a href="/article/3255.htm" title="AngularJS浅析" target="_blank">AngularJS浅析</a> <span class="text-muted">kvhur</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>概念 AngularJS is a structural framework for dynamic web apps. 了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm Directive 扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间</div> </li> <li><a href="/article/3382.htm" title="架构师之jdk的bug排查(一)---------------split的点号陷阱" target="_blank">架构师之jdk的bug排查(一)---------------split的点号陷阱</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/split/1.htm">split</a> <div>1.前言.    jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug. 2.代码 String[] paths = "object.object2.prop11".split("'"); System.ou</div> </li> <li><a href="/article/3509.htm" title="如何对10亿数据量级的mongoDB作高效的全表扫描" target="_blank">如何对10亿数据量级的mongoDB作高效的全表扫描</a> <span class="text-muted">quentinXXZ</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>  本文链接:  http://quentinXXZ.iteye.com/blog/2149440 一、正常情况下,不应该有这种需求 首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。 说一下,</div> </li> <li><a href="/article/3636.htm" title="C语言算法之水仙花数" target="_blank">C语言算法之水仙花数</a> <span class="text-muted">qiufeihu</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>/** * 水仙花数 */ #include <stdio.h> #define N 10 int main() { int x,y,z; for(x=1;x<=N;x++) for(y=0;y<=N;y++) for(z=0;z<=N;z++) if(x*100+y*10+z == x*x*x</div> </li> <li><a href="/article/3763.htm" title="JSP指令" target="_blank">JSP指令</a> <span class="text-muted">wyzuomumu</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a> <div> jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %> 常用的三种指令: page,include,taglib page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%> include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>