为你的WordPress主题框架添加过滤挂钩

迷离的夜空,灰黑色的天际悬着一轮金色的孤舟,载着满仓的梦想,驶向云层深处;凉风微微的吹袭着黑夜的素纱,掸掉岁月的风尘;融融的月光静静的流淌,冲断记忆的决堤;零星点点,柔柔的洒在树叶上,泛出浅浅的绿;如华的银色裹住一丝清凉,铺设一地的奢华。
本文是《开发你的 WordPress 主题框架》专题的第 6 篇,共 10 篇:
  • 为你的WordPress主题框架添加动作挂钩
  • WordPress 主题框架是如何工作的
  • 决定如何开发你的WordPress主题框架
  • 为你的WordPress主题框架建立起始文件
  • 为你的WordPress主题框架添加函数
  • 为你的WordPress主题框架添加过滤挂钩
  • 为你的WordPress主题框架创建子主题
  • 为你的WordPress主题框架开发插件
  • 发布你的WordPress主题框架
  • 为你的WordPress主题框架编写文档

到目前为止,你已经为你的主体框架添加了动作挂钩(action hooks),你已经编写了一些函数,它们由这些挂钩激活。下一步是添加一些过滤挂钩,从而能够带给你更大的灵活性。

简述动作挂钩和过滤挂钩

在开始之前,有必要对动作挂钩和过滤挂钩之间的差异做一个简要的概述:

  • 动作挂钩会在代码的特定地点被触发。动作挂钩本身并不包含任何可执行代码,但是会在代码中提供一个地点,由相关函数在这个地点实现你想完成的事情,而这些函数又是由这些动作挂钩激活的。
  • 过滤挂钩使得改变已经写入主题中的代码成为可能。过滤挂钩不会为空,而是包裹在一些现有的代码之中,这样你就可以使用附加到挂钩上的函数来修改或覆盖它。

更多细节,详见动作挂钩和过滤挂钩初学者指南。

如何创建和使用一个过滤挂钩

然后使用add_filter() 函数访问该过滤挂钩,如下所示:

1
2
3
<?php
apply_filters( 'my_filter', 'code to be filtered goes here' );
?>

<?php apply_filters( 'my_filter', 'code to be filtered goes here' ); ?>

你添加到这个函数中的内容将代替框架中的过滤性代码,这里也就是你更改或重新覆盖原有代码的位置。

1
2
3
4
5
6
<?php
function my_function() {
    // code for function here
}
add_filter( 'my_filter', 'my_function' );
?>

<?php function my_function() { // code for function here } add_filter( 'my_filter', 'my_function' ); ?>

你需要做的是

跟随本好代码教程,你需要:

  • 安装一个WordPress开发环境
  • 一个代码编辑器
  • 来自前期好代码教程的代码,前提是你使用的是我的主题框架中的代码

添加过滤挂钩

在这一课,我会给主题框架添加三个过滤挂钩:

  • 在网页页眉的过滤挂钩中,我会附上该网站的标题和说明。
  • 在网页页脚中,我将给版权标记添加一个过滤挂钩,这我们上节课就已经添加过了。

这意味着,将来这两者都可以被子主题或插件修改/覆盖。你可以给你的主题框架添加更多的过滤挂钩:任何你要添加代码的位置,或者之后你可能想要改变的标记,你都可以使用过滤挂钩去实现这种改变,而无需去在一个子主题中新建模板文件。

添加一个过滤挂钩到网站标题和说明

从网站标题和说明开始。打开你的主题header.php文件,找到下列代码:

1
2
3
4
5
6
7
<div class="site-name half left">
    <!-- site name and description - site name is inside a div element on all pages except the front page and/or main blog page, where it is in a h1 element -->
    <h1 id="site-title">
        <a rel="nofollow noopener noreferrer" href="<?php echo home_url(); ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a>
    </h1>
    <h2 id="site-description"><?php bloginfo( 'description' ); ?></h2>
</div>

<div class="site-name half left"> <!-- site name and description - site name is inside a div element on all pages except the front page and/or main blog page, where it is in a h1 element --> <h1 id="site-title"> <a rel="nofollow noopener noreferrer" href="<?php echo home_url(); ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a> </h1> <h2 id="site-description"><?php bloginfo( 'description' ); ?></h2> </div>

与其只编写一个过滤挂钩,倒不如分别给每一个标题和每一个说明都添加一个过滤挂钩,这样会更好,因为你可以修改或者改变其中任意一个在输出内容,或者两个都行。

每一种情况下,都要将bloginfo()函数替换成get_bloginfo()函数,在apply_filters()函数之前添加echo。我们就从网站标题开始。在元素h1中编辑代码,如下所示:

1
2
3
4
5
<h1 id="site-title">
    <a rel="nofollow noopener noreferrer" href="<?php echo home_url(); ?>" title="<?php echo esc_attr( apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name', 'display' ) ) ); ?>" rel="home">
        <?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?>
    </a>
</h1>

<h1 id="site-title"> <a rel="nofollow noopener noreferrer" href="<?php echo home_url(); ?>" title="<?php echo esc_attr( apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name', 'display' ) ) ); ?>" rel="home"> <?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?> </a> </h1>

正如你所看到的,我已经先后两次添加了apply_filters()函数——第一次是为了链接的标题属性,之后是为了显示的文本。新代码如下:

1
<?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?>

<?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?>

这里建立了一个名为wptutsplus_sitetitle的挂钩,然后将它应用到get_bloginfo( 'name') 函数,再重新输出。

标题说明也是如此,但会简单一点,因为它没有链接。编辑h2元素如下所示:

1
2
3
<h2 id="site-description">
    <?php echo apply_filters( 'wptutsplus_sitedescription', get_bloginfo( 'description' ) );?>
</h2>

<h2 id="site-description"> <?php echo apply_filters( 'wptutsplus_sitedescription', get_bloginfo( 'description' ) );?> </h2>

这不会影响 h2元素的输出内容,但是会给你一个过滤挂钩,之后你可以用它来改变 h2元素。

给版权标记添加一个过滤挂钩

下面,我要给版权标记添加一个过滤挂钩,这个挂钩在我的functions.php文件中的一个函数里。它能让我的框架用户修改或者覆盖版权标记的内容。

首先打开你的functions.php文件,找到下面的代码块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function wptp_colophon() { ?>
    <section class="colophon" role="contentinfo">
        <small class="copyright half left">
            © <a rel="nofollow noopener noreferrer" href="<?php echo home_url( '/' ) ?>"><?php bloginfo( 'name' ); ?></a> 2014
        </small><!-- #copyright -->

        <small class="credits half right">
            <?php _e( 'Proudly powered by', 'tutsplus' ); ?> 
            <a rel="nofollow noopener noreferrer" href="http://wordpress.org/">WordPress</a>.
        </small><!-- #credits -->
    </section><!--#colophon-->

<?php        
}

function wptp_colophon() { ?> <section class="colophon" role="contentinfo"> <small class="copyright half left"> © <a rel="nofollow noopener noreferrer" href="<?php echo home_url( '/' ) ?>"><?php bloginfo( 'name' ); ?></a> 2014 </small><!-- #copyright --> <small class="credits half right"> <?php _e( 'Proudly powered by', 'tutsplus' ); ?> <a rel="nofollow noopener noreferrer" href="http://wordpress.org/">WordPress</a>. </small><!-- #credits --> </section><!--#colophon--> <?php }

现在将输出博客名的那行代码放于一个链接中,把这两个函数包裹在一个apply_filters()函数中,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function wptp_colophon() { ?>
    <section class="colophon" role="contentinfo">
        <small class="copyright half left">
            ©<a rel="nofollow noopener noreferrer" href="<?php echo apply_filters( 'wptp_colophon_link', home_url( '/' ) ?>">) ?>"><?php echo apply_filters('wptp_colophon_name', get_bloginfo( 'name' ) ); ?></a> 2014
        </small><!-- #copyright -->

        <small class="credits half right">
            <?php _e( 'Proudly powered by', 'tutsplus' ); ?> 
            <a rel="nofollow noopener noreferrer" href="http://wordpress.org/">WordPress</a>.
        </small><!-- #credits -->
    </section><!--#colophon-->

<?php        
}

function wptp_colophon() { ?> <section class="colophon" role="contentinfo"> <small class="copyright half left"> ©<a rel="nofollow noopener noreferrer" href="<?php echo apply_filters( 'wptp_colophon_link', home_url( '/' ) ?>">) ?>"><?php echo apply_filters('wptp_colophon_name', get_bloginfo( 'name' ) ); ?></a> 2014 </small><!-- #copyright --> <small class="credits half right"> <?php _e( 'Proudly powered by', 'tutsplus' ); ?> <a rel="nofollow noopener noreferrer" href="http://wordpress.org/">WordPress</a>. </small><!-- #credits --> </section><!--#colophon--> <?php }

这里,我创建了两个过滤挂钩:

  • echo apply_filters( 'wptp_colophon_link', home_url( '/' ) 应用于该名称指向的链接。
  • echo apply_filters('wptp_colophon_name', get_bloginfo( 'name' ) ) 应用于该名称本身。

如果之后我想要改变这两个过滤挂钩的话,我可以用几个简单的函数做到,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function wptp_amend_colophon_name() {

    $name = 'Rachel McCollin';
    return $name;

}
add_filter( 'wptp_colophon_name', 'wptp_amend_colophon_name' );

function wptp_amend_colophon_link() {

    $link = 'http://rachelmccollin.co.uk';
    return $link;

}
add_filter( 'wptp_colophon_link', 'wptp_amend_colophon_link' );

function wptp_amend_colophon_name() { $name = 'Rachel McCollin'; return $name; } add_filter( 'wptp_colophon_name', 'wptp_amend_colophon_name' ); function wptp_amend_colophon_link() { $link = 'http://rachelmccollin.co.uk'; return $link; } add_filter( 'wptp_colophon_link', 'wptp_amend_colophon_link' );

每一个函数在原有的过滤挂钩中返回了PHP函数中一些静态内容,取代了主页网址(the home url)、博客名和网址:

小结

在这里,我已经添加了几个简单的过滤挂钩,可以让你或你的框架用户在更改输出内容时,无需去创建新的模板文件。正如我们所看到的,一个过滤挂钩,不同于一个动作挂钩,它可以让你修改已经通过挂钩输出的内容,而不是增加新的东西到一个空挂钩中。

在某些情况下,你也许会发现,一个过滤挂钩会变得过于复杂,在这种情况下,你需要编写一个新的函数,而有时也需要新建一个模板文件。例如,如果我想让版权标记变化更加明显,我可以在我的子主题中添加一个名为 wptp_colophon() 的新函数——由于框架中的 wptp_colophon() 函数是可插拔的,我的新函数会覆盖它。但是,如果我想更换整个页脚,我就不得不去创建一个新的 footer.php 文件了。

过滤挂钩是非常有用的,但为了避免繁重的无用之功——当你在编写框架模板文件时,最好考虑一下用户可能想要修改的输出内容,并把它包裹在apply_filters() 函数里面。

  • 原文出自:http://code.tutsplus.com/tutorials/adding-filter-hooks-to-your-wordpress-theme-framework--cms-21779
  • 由 stonetan@WordPress大学 原创翻译,未经允许,禁止转载和采用本译文。

本文为你的WordPress主题框架添加过滤挂钩到此结束。只有经历最痛苦的坚持,才能配的上最永久的幸福。小编再次感谢大家对我们的支持!

标签: WordPress