1

私はこれにまったく慣れていません(WP Gutsを理解しています)。フックとフィルターをよりよく理解したかったのですが、Codexから正しく取得できません。

簡単なテストをしましたが、

アイデアは、ページが保護されている場合、タイトルから「Protected:」文を消去するために 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 );
}

出力へのエコーを取得できますが、$id を取得できません (そのため、$title も $post も取得できません)。このメソッドは、get_title() のコピーであり、保護された部分文字列以外のすべてを取り除きます。

これがどのように機能するかを説明してくれる人はいますか? ありがとうございました


PS私が学びたいのは、これがこの質問のアイデアであり、「ねえ、post-template.phpに行って変更してください」と言う人ではなく、「WPを更新するときはどうですか... ?」!

4

1 に答える 1

3

あなたは実際にあなたがしようとしていることよりもはるかに簡単にこれを行うことができます。しかし、あなたは正しい方向に進んでいます。

基本的に、あなたがしたいのは、WordPressタイトルの「Protected:」部分を取り除く独自の関数を作成することです。これを行う最も簡単な方法は、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」フィルターに追加されます。この場合、3番目の引数を使用して、フィルターの優先度を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でテストしたところ、機能したので、プロジェクトで機能するかどうかをお知らせください。

于 2009-08-27T17:21:04.520 に答える