web-dev-qa-db-ja.com

ページリストのタイトルの前のダッシュを置き換える

ダッシュボードページリストのページタイトルの前のダッシュを置き換えます。最初の階層の下の各階層には、ダッシュが追加されます(下のスクリーンショットを参照)。

enter image description here 

フィルタthe_titleはこれらのダッシュには影響しないようです。

add_filter( 'the_title', 'change_my_title' );
function change_my_title( $title ) {
    return str_replace( '–', $title );
    // nor preg_replace or – or — work
}

だから私の質問です: どうやってこれらのダッシュを特定のものに置き換えることができますか?私は本当にカスタムリストテーブルを実装する必要があるのですか?

4
uruk

フィルタを変更するのに利用できるフィルタがないため、どのフィルタを使用してもダッシュを変更することはできません。

しかしそれでもjQueryを使ってこれを変更することができます。このコードをfunctions.phpの中に入れてください。

add_action('admin_head',function(){


global $pagenow;

// check current page.
if( $pagenow == 'edit.php' ){ ?>

    <script>

        jQuery(function($){

            var post_title = $('.wp-list-table').find('a.row-title');
            $.each(post_title,function(index,em){
                var text = $(em).html();
                // Replace all dashes to * 
                $(em).html(text.replace(/—/g ,'*'));
            });
        });

    </script>
    <?php
    }
});

https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-posts-list-table.php#L918-L919 を参照してください。

3
Govind Kumar

これは ハードコーディングされた であり、リストテーブルクラス全体を変更しないと変更できません。

    $pad = str_repeat( '&#8212; ', $this->current_level );
    echo "<strong>";

    $format = get_post_format( $post->ID );
    if ( $format ) {
        $label = get_post_format_string( $format );

        $format_class = 'post-state-format post-format-icon post-format-' . $format;

        $format_args = array(
            'post_format' => $format,
            'post_type' => $post->post_type
        );

        echo $this->get_edit_link( $format_args, $label . ':', $format_class );
    }

    $can_edit_post = current_user_can( 'edit_post', $post->ID );
    $title = _draft_or_post_title();

    if ( $can_edit_post && $post->post_status != 'trash' ) {
        printf(
            '<a class="row-title" href="%s" aria-label="%s">%s%s</a>',
            get_edit_post_link( $post->ID ),
            /* translators: %s: post title */
            esc_attr( sprintf( __( '&#8220;%s&#8221; (Edit)' ), $title ) ),
            $pad,
            $title
        );
    } else {
        echo $pad . $title;
    }

そしてそのテーブルを変更することさえ非常に困難です、なぜならクラスインスタンスは グローバル変数に設定されています 関数_get_list_table()を使って - それはフィルタさえ提供しません。

手続き型コードの素晴らしい世界へようこそ。

そのためにはJavaScriptを使用する必要があると思います。

3
fuxia

@Toschoが言うように、title列はハードコーディングされているので、それを変更することはできません。ただし、できることは、列を削除してカスタム列として再定義することです。

add_filter( 'manage_pages_columns', 'wpse248405_columns', 25, 1 );
function wpse248405_columns ($cols) {
   // remove title column
   unset( $cols['title'] );
   // add custom column in second place
   $cols = array('cb' => $cols['cb']) + array('title' => __( 'Title', 'textdomain' )) + $cols;
   // return columns
   return $cols;
   }

これで、カスタム列を 元のように のように動作させる必要があります。

add_action( 'manage_pages_custom_column', 'wpse248405_custom_column', 10, 2 );
function wpse248405_custom_column( $col, $post_id ) {
    if ($col == 'title') {
        $post               = get_post( $post_id );
        $title              = _draft_or_post_title();
        $can_edit_post      = current_user_can( 'edit_post', $post->ID );
        // set up row actions
        $actions = array();
        if ( $can_edit_post && 'trash' != $post->post_status ) {
            $actions['title'] = '<strong><a href="' . get_edit_post_link( $post->ID, true ) . '" aria-label="' . $title . esc_attr( __( 'Edit this item' ) ) . '">' . $title . '</a></strong>';
            // invoke row actions
            $table = new WP_Posts_List_Table;
            echo $table->row_actions( $actions, true );
            }
        }
     }

あなた自身の機能の中核的な振る舞いをまねると、将来の中核的なリリースに対して脆弱になることに注意してください。

3
cjbj