我对此很了解(了解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时怎么样??” !
答案 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上对此进行了测试,但它确实有效,请让我知道它是否适用于您的项目。