我不明白这个参数是如何工作的..?

时间:2015-03-10 作者:chrsmrtn81

好的,我有一个简单插件的简单代码,这个插件在文章标题前加上单词TESTING。。我真的不清楚这个参数是如何工作的。我知道参数在PHP中是如何工作的,但是没有在这个参数中传递任何信息,WordPress无法知道变量是标题。。如果这有道理的话??不知道它是怎么工作的。

我在WordPress开发方面仍然相当差劲——我似乎总是开始,陷入困境,并没有走多远。

add_filter(\'the_title\', \'cm_title\');

/**
* Modify the title prepending the article title with the word \'TESTING\'
*/

function cm_title($text) {

return \'TESTING  \' . $text;

}

2 个回复
最合适的回答,由SO网友:Sean Grant 整理而成

让我们看看是否可以将其分解,以便易于理解。

您有一个名为“cm\\u title”的PHP函数:

function cm_title($text) {
   return \'TESTING  \' . $text;
}
它只做一件事。它接受给定的“$text”,并返回该$text,并在其前面加上“Testing”字样。

WordPress如何知道“$文本”是什么?

由于此WP过滤器,它知道/将数据分配给$文本参数:

add_filter(\'the_title\', \'cm_title\');
此筛选器在生成“the\\u title”时由WP检查。因此,就在WP吐出“the\\u title”之前,它会检查是否有要使用的过滤器。在这种情况下,我们告诉WP在吐出标题之前应用此过滤器(“cm\\u title”)函数。

所有这些都表明,WP发送到目前为止为“the\\u title”(即“这是一篇关于我的帖子”)提供的内容,并在吐出之前通过此过滤器运行。

So in this case, \'This is a Post About me\' is the data in the $text parameter in the cm_title function.

你的最终结果是“测试这是一篇关于我的帖子”。

这有助于清理吗?

SO网友:Howdy_McGee

WordPress使用挂钩来帮助开发人员以相对简单的方式完成他们需要做的事情。有些钩子是apply_filter()do_action() 由WordPress定义。让我们看看打电话时会发生什么the_title() 一直到它碰到你定义的钩子为止。

<?php the_title(); ?>

Developer Resources - the_title()

function the_title($before = \'\', $after = \'\', $echo = true) {
    $title = get_the_title();

    if ( strlen($title) == 0 )
        return;

    $title = $before . $title . $after;

    if ( $echo )
        echo $title;
    else
        return $title;
}
就在它调用的顶部get_the_title() 我们可以在这里找到过滤器。让我们看一下:

Developer Resources - get_the_title()

function get_the_title( $post = 0 ) {
    $post = get_post( $post );

    $title = isset( $post->post_title ) ? $post->post_title : \'\';
    $id = isset( $post->ID ) ? $post->ID : 0;

    if ( ! is_admin() ) {
        if ( ! empty( $post->post_password ) ) {

            /**
             * Filter the text prepended to the post title for protected posts.
             *
             * The filter is only applied on the front end.
             *
             * @since 2.8.0
             *
             * @param string  $prepend Text displayed before the post title.
             *                         Default \'Protected: %s\'.
             * @param WP_Post $post    Current post object.
             */
            $protected_title_format = apply_filters( \'protected_title_format\', __( \'Protected: %s\' ), $post );
            $title = sprintf( $protected_title_format, $title );
        } else if ( isset( $post->post_status ) && \'private\' == $post->post_status ) {

            /**
             * Filter the text prepended to the post title of private posts.
             *
             * The filter is only applied on the front end.
             *
             * @since 2.8.0
             *
             * @param string  $prepend Text displayed before the post title.
             *                         Default \'Private: %s\'.
             * @param WP_Post $post    Current post object.
             */
            $private_title_format = apply_filters( \'private_title_format\', __( \'Private: %s\' ), $post );
            $title = sprintf( $private_title_format, $title );
        }
    }

    /**
     * Filter the post title.
     *
     * @since 0.71
     *
     * @param string $title The post title.
     * @param int    $id    The post ID.
     */
    return apply_filters( \'the_title\', $title, $id );
}
您会直接注意到它调用的函数的底部apply_filters() 并在function_namestring, $titlestring$idint 然后返回任何内容apply_fitlers() 返回,这是您的挂钩。让我们看看apply_filters():

Developer Resources - apply_filters()

function apply_filters( $tag, $value ) {
    global $wp_filter, $merged_filters, $wp_current_filter;

    $args = array();

    // Do \'all\' actions first.
    if ( isset($wp_filter[\'all\']) ) {
        $wp_current_filter[] = $tag;
        $args = func_get_args();
        _wp_call_all_hook($args);
    }

    if ( !isset($wp_filter[$tag]) ) {
        if ( isset($wp_filter[\'all\']) )
            array_pop($wp_current_filter);
        return $value;
    }

    if ( !isset($wp_filter[\'all\']) )
        $wp_current_filter[] = $tag;

    // Sort.
    if ( !isset( $merged_filters[ $tag ] ) ) {
        ksort($wp_filter[$tag]);
        $merged_filters[ $tag ] = true;
    }

    reset( $wp_filter[ $tag ] );

    if ( empty($args) )
        $args = func_get_args();

    do {
        foreach( (array) current($wp_filter[$tag]) as $the_ )
            if ( !is_null($the_[\'function\']) ){
                $args[1] = $value;
                $value = call_user_func_array($the_[\'function\'], array_slice($args, 1, (int) $the_[\'accepted_args\']));
            }

    } while ( next($wp_filter[$tag]) !== false );

    array_pop( $wp_current_filter );

    return $value;
}
它看起来很复杂,但在我们开始之前,让我们先看看这个函数最重要的部分,$wp_filter. 现在这个小错误包含了您和WordPress添加的所有过滤器。您可以在wp_head() 查看完整列表。看起来像这样(还有很多吨,我刚刚选的the_title 因为这是主题!)

[the_title] => Array
    (
        [10] => Array
            (
                [wptexturize] => Array
                    (
                        [function] => wptexturize
                        [accepted_args] => 1
                    )

                [convert_chars] => Array
                    (
                        [function] => convert_chars
                        [accepted_args] => 1
                    )

                [trim] => Array
                    (
                        [function] => trim
                        [accepted_args] => 1
                    )

            )

        [11] => Array
            (
                [capital_P_dangit] => Array
                    (
                        [function] => capital_P_dangit
                        [accepted_args] => 1
                    )

            )

    )
这是一个多维过滤器数组,索引为tag, 然后由priority 最终由function name. 我觉得很整洁!由于没有传递优先级,您添加的过滤器默认为索引10,并将添加到正下方trim 然后通过函数名进一步索引cm_title.

让我们往回走一点。如果我们看看get_the_title() 上面的函数我们看到它通过three 变量输入到apply_filters 功能,但我们可以清楚地看到,它只接受two 参数!我必须仔细研究一下,它看起来像一个小函数,func_get_args() 我们看到里面乱扔垃圾apply_filters() 实际上会抓住任何传递给它的东西。Here\'s an example, 这个Codepen 也很好。现在,即使可以传递任何内容,如果我们回过头来看我们的多维数组,有一个accepted_args 参数从技术上讲,即使它允许您这样做,您也不能这样做。

最后,它使用$wp_filters 阵列:

do {
    foreach( (array) current($wp_filter[$tag]) as $the_ )
        if ( !is_null($the_[\'function\']) ){
            $args[1] = $value;
            $value = call_user_func_array($the_[\'function\'], array_slice($args, 1, (int) $the_[\'accepted_args\']));
        }

} while ( next($wp_filter[$tag]) !== false );
所以,让我们一起来吧!

  • the_title() 呼叫get_the_title()
  • get_the_title() 退货apply_filters(), 传入:“the\\u title”(函数名),$title (字符串帖子标题),$id (int post id)
  • apply_filters() 查看包含所有已添加过滤器的全局数组,然后运行这些过滤器并传入传递给它的信息($title, 和$id ).

您调用的函数add_filter 实际上,将函数名、优先级和参数添加到全局$wp_filters 大堆您可以看到以下内容:

Developer Resources - add_filter()

function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
    global $wp_filter, $merged_filters;

    $idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
    $wp_filter[$tag][$priority][$idx] = array(\'function\' => $function_to_add, \'accepted_args\' => $accepted_args);
    unset( $merged_filters[ $tag ] );
    return true;
}
真的,这是以前打过的the_title() 有人打过电话。您的函数加载了wp_head() 因此,您通过插件或functions.php 也将添加到此全局数组。

那太长了,但如果你在评论中有任何问题,希望现在它更有意义了!

结束

相关推荐

将显示名称设置为名字和姓氏(phpmyadmin SQL查询)

我正在尝试将所有用户的显示名称更改为他们的名字和姓氏。我已经研究了许多插件,并编写了自己的PHP来尝试实现这一点,但该网站有50000多名注册用户(我可以想象大多数是来自我的客户以前网站的垃圾邮件),但正因为如此,PHP挂起了,在放弃之前只有大约2000个。因此,我认为下一个最好的方法是从PHPmyAdmin中编写一个SQL语句来执行该任务,然而纯SQL让我很困惑,到目前为止,我所能做的就是将显示名设置为用户的名字,我不确定如何获得姓氏。这是我使用的语句。UPDATE wp_users, wp_userm