web-dev-qa-db-ja.com

Adminで抜粋メタボックスの説明をフィルタするにはどうすればよいですか?

デフォルトの「抜粋は、テーマで使用できるコンテンツのオプションの手作りの要約です。手動の抜粋の詳細」を変更します。抜粋入力領域の下のテキストを、私のカスタム投稿タイプにとってより意味のあるものにしてください。

「翻訳」フィルタを使用して、投稿タイトルと似たようなことをしましたが、投稿の抜粋でこれを行うにはどうすればよいですか。

これが私の現在のコードです:
add_filter('gettext', 'custom_rewrites', 10, 4);
function custom_rewrites($translation, $text, $domain) {

    global $post;

    $translations = &get_translations_for_domain($domain);
    $translation_array = array();

    switch ($post->post_type) {
        case 'model':
            $translation_array = array(
                'Enter title here' => 'Enter model name here',
                'Excerpt' => "Byline",
                'Excerpts are optional hand-crafted summaries of your content that can be used in your theme.' => "Foobar"
            );
            break;
    }

    if (array_key_exists($text, $translation_array)) {
        return $translations->translate($translation_array[$text]);
    }

    return $translation;
}

3番目の翻訳はうまくいきませんか?

4
Amanda

この説明はpost_excerpt_meta_box()関数によって生成され、明示的なフィルタを通過することはありません。しかし、それは翻訳関連の _e() 関数によって反映されているので、gettextフィルタを通過します(あなたの質問からはあなたはすでによく知っています)。

それをあなたのCPTに制限することに関しては、私はadminの現在の投稿タイプがあなたがチェックできるグローバルな$post_type変数に保持されていると思います。

5
Rarst

返事

翻訳フィルタのみ

タイトルとコンテンツにはデフォルトのフィルタがありますが、抜粋ウィンドウにはありません。デフォルトのメタボックスを削除し、新しい(変更された)メタボックスを追加するOR gettextフィルタで文字列をフィルタ処理します。

メタボックス

あなたは基本的にメタボックスを削除するという概念を知っています(そうでなければ、それをこのサイトで検索してください)。それからちょうど同じであるがあなたのカスタムコールバックのわずかに変更されたUIを持つ新しいメタボックスを追加するだけです。

参考として、これはコアからのオリジナルです。

function post_excerpt_meta_box($post) {
?>
<label class="screen-reader-text" for="excerpt"><?php _e('Excerpt') ?></label><textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"><?php echo $post->post_excerpt; // textarea_escaped ?></textarea>
<p><?php _e('Excerpts are optional hand-crafted summaries of your content that can be used in your theme. <a href="http://codex.wordpress.org/Excerpt" target="_blank">Learn more about manual excerpts.</a>'); ?></p>
<?php
}

Gettext

ここで重要なのは、このフィルタはUI内のすべての翻訳可能な文字列に対してトリガーされるということです(たくさんあります)。以下のプラグインでは、投稿タイプのデフォルトのタイトルプレースホルダ、デフォルトのコンテンツ、そしてこの文字列を変更するために可能な限り遅くフックする方法を変更する方法があります。フィルタを削除して、それ以降のフィルタが遅くなることがないようにします。

<?php
/** Plugin Name: (#72418) "kaiser" Alter Post Type UI strings */

if ( ! class_exists( 'WPSE72418_alter_ptui_strings' ) )
{
    add_action( 'plugins_loaded', array( 'WPSE72418_alter_ptui_strings', 'init' ) );
class WPSE72418_alter_ptui_strings
{
    static protected $instance;

    public $post_type = 'post';

    public $to_replace = 'Excerpts are optional hand-crafted summaries of your content that can be used in your theme. <a href="http://codex.wordpress.org/Excerpt" target="_blank">Learn more about manual excerpts.</a>';

    static public function init()
    {
        null === self :: $instance AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        add_action( 'init', array( $this, 'add_post_type' ) );

        add_filter( 'enter_title_here', array( $this, 'alter_title_string' ), 10, 2 );

        add_filter( 'default_content', array( $this, 'add_editor_default_content' ) );

        add_action( 'admin_menu', array( $this, 'add_excerpt_note_filter' ) );
    }

    public function alter_title_string( $title, $post )
    {
        if ( $this->post_type !== $post->post_type )
            return $title;

        return $title = __( 'Enter TITLE name here', 'your_textdomain' );
    }

    public function add_editor_default_content( $content )
    {
        if ( $this->post_type !== get_current_screen()->post_type )
            return $content;

        return __( 'Enter the POST TYPES long description here.', 'your_textdomain' );
    }

    public function add_excerpt_note_filter( $post )
    {
        add_filter( 'gettext', array( $this, 'alter_excerpt_mb_note' ), 10, 3 );
    }

    public function alter_excerpt_mb_note( $l10n, $string, $domain )
    {
        // Remove when not on the needed post type page
        if (
            ! is_null( get_current_screen() )
            AND $this->post_type !== get_current_screen()->post_type 
            )
        {
            remove_filter( current_filter(), array( $this, __FUNCTION__ ) );
            return;
        }

        // Remove when done
        if ( $this->to_replace === $string )
        {
            remove_filter( current_filter(), array( $this, __FUNCTION__ ) );
            return __( 'NEW FOOTNOTE', 'your_textdomain' );
        }

        return $l10n;
    }
} // END Class WPSE72418_alter_ptui_strings

} // endif;
1
kaiser