wordpress:动作,过滤器和挂钩

时间:2009-07-29 06:43:28

标签: wordpress hook filter action

我对此很了解(了解WP Guts),我想更好地理解Hooks和Filters,我无法从Codex中理解它。

我做了一个简单的测试,

我们的想法是覆盖get_title()方法,以便在页面受到保护时删除标题中的“受保护:”句子,有一个protected_title_format过滤器,我想用它...

post-template.php 中的那一行指定:

$protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));

我可以从CODEX获得,我需要删除该过滤器并添加我自己的过滤器,如

remove_action('protected_title_format');
apply_filters('protected_title_format', __('MY OWN PAGE Protected: %s'));

使用,偏离

之类的东西
// Removing action
function remove_title_action() {
    remove_action('protected_title_format','get_the_title',3);
}
add_action('init','remove_title_action');

// Adding custom function
add_action('protected_title_format','fancy_title', 3, 4);

function fancy_title($id = 0) {
    $post = &get_post($id);
    $title = $post->post_title;

    echo "I'm the king of the world!... >" . $title . "< & >" . $post . "<";

    if ( !is_admin() ) {
    if ( !empty($post->post_password) ) {
        $protected_title_format = apply_filters('protected_title_format', __('MY OWN PAGE Protected: %s'));
        $title = sprintf($protected_title_format, $title);
    }
    }
    return apply_filters( 'the_title', $title, $post->ID );
}

我可以获得echo输出,但是我没有得到$ id(并且为此,没有$ title或$ post),这个方法是get_title()的副本,除了受保护的部分字符串之外的所有内容。 / p>

任何人都可以解释我如何运作? 谢谢


PS 我想学习,这是这个问题的想法,而不是有人告诉我“嘿,只是去post-template.php并改变它”,因为那时我会问“当我更新WP时怎么样??” !

1 个答案:

答案 0 :(得分:3)

你实际上可以比你正在尝试的更简单地做到这一点。你虽然走在正确的轨道上。

基本上,你想要做的是创建自己的功能,将删除WordPress标题的“受保护的”部分。最简单的方法是简单地创建一个函数,该函数使用preg_replace()来搜索“受保护的:”文本并将其剥离。您可以轻松地使用自己的文本自动替换字符串。

这是一个样本函数。我们将$ title作为参数并返回它的修改版本。

function remove_protected_text($title) {
  $match = '/Protected: /';
  $replacement = '';

  $title = preg_replace($match, $replacement, $title);
  return $title;
}

我们要做的下一件事实际上是将我们的函数添加到过滤器钩子中。在这种情况下我们感兴趣的过滤器钩子是'the_title'。因此,我们在刚刚编写的函数下面添加以下行:

add_filter( 'the_title', 'remove_protected_text', 10);

这会将我们的函数remove_protected_text()添加到'the_title'过滤器中。在这种情况下,我使用第三个参数给我们的过滤器优先级为10.这完全是可选的,但我认为这个过滤器的优先级非常低。

所以我们的代码应该像这样:

function remove_protected_text($title) {
    $match = '/Protected: /';
    $replacement = '';

    $title = preg_replace($match, $replacement, $title);
    return $title;
}
add_filter( 'the_title', 'remove_protected_text', 10);

将该代码添加到主题中的functions.php文件将允许它工作。您可以为输出文本的WordPress的大多数部分编写这样的过滤器。

<强>更新

这是该函数的修订版本,应该获得翻译后的字符串“Protected:”并将其删除:

function remove_protected_text($title) {
    $protected = __('Protected: %s');
    $protected = preg_replace('/ %s/', '', $protected);

    $match = "/${protected}/";
    $replacement = '';

    $title = preg_replace($match, $replacement, $title);

    return $title;
}
add_filter( 'the_title', 'remove_protected_text');

基本上,这里唯一的变化是我们使用__()函数来转换受保护的字符串,然后去掉额外的位。这有点像hackish,我确信有更好的方法可以做到,但它确实可以用于我的测试。

我在西班牙语版本的WordPress上对此进行了测试,但它确实有效,请让我知道它是否适用于您的项目。