WordPress: действия, фильтры и хуки

wordpress hook filter action

2932 просмотра

1 ответ

54485 Репутация автора

Я довольно новичок в этом (понимая WP Guts), и я хотел лучше понять Хуки и Фильтры, я не могу понять это прямо из Кодекса.

Я сделал простой тест,

идея состоит в том, чтобы переопределить метод get_title (), чтобы стереть предложение «Protected:» из заголовка, если страница защищена, есть фильтр 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 );
}

Я могу получить эхо для вывода, но я не получаю $ id (и для этого нет $ title или $ post), этот метод является копией get_title (), удаляющей все, кроме строки защищенной части.

Кто-нибудь может объяснить мне, как это работает ? Спасибо


PS Я хочу узнать, это идея этого вопроса, а не кто-то сказать мне «Эй, просто зайдите в post-template.php и измените его», потому что тогда я бы спросил: «Как насчет того, когда я обновлю WP ... ?» !

Автор: balexandre Источник Размещён: 29.07.2009 06:43

Ответы (1)


3 плюса

784 Репутация автора

Решение

На самом деле вы можете сделать это гораздо проще, чем пытаетесь. Вы на правильном пути, хотя.

По сути, вы хотите создать свою собственную функцию, которая удалит часть «Защищенный:» из заголовков WordPress. Самый простой способ сделать это - просто создать функцию, которая использует preg_replace () для поиска текста «Protected:» и удаления его. С таким же успехом вы можете автоматически заменить строку собственным текстом.

Вот пример функции, которая делает это. Мы берем $ 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');

По сути, единственное изменение здесь заключается в том, что мы используем функцию __ () для перевода защищенной строки, а затем удаляем лишние биты. Это немного хакерски, и я уверен, что есть лучший способ сделать это, но в моем тестировании это работает.

Я проверил это на испанской версии WordPress, и это сработало, поэтому дайте мне знать, работает ли оно для вашего проекта.

Автор: NerdStarGamer Размещён: 27.08.2009 05:21
Вопросы из категории :
32x32