web-dev-qa-db-fra.com

Remplacer les tirets avant le titre dans la liste de pages

Je souhaite remplacer les tirets avant le titre de la page dans la liste des pages du tableau de bord. Pour chaque hiérarchie en dessous de la première, un tiret est ajouté (comme le montre la capture d'écran ci-dessous):

 enter image description here 

Il semble que le filtre the_title n'affecte pas ces tirets:

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

Ma question est donc la suivante: Comment puis-je remplacer ces tirets par quelque chose de spécifique? Dois-je vraiment implémenter une liste personnalisée ou manipuler jQuery?

4
uruk

Vous ne pouvez pas modifier les tirets à l'aide d'un filtre, car aucun filtre ne le permet.

mais vous pouvez toujours changer cela en utilisant jQuery mettre ce code à l'intérieur de 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
    }
});

Voir https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-posts-list-table.php#L918-L919

3
Govind Kumar

Ceci est codé en dur et ne peut pas être modifié sans changer la classe entière de la liste:

    $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;
    }

Et même changer cette table est très difficile, car l'instance de la classe est définie sur une variable globale avec la fonction _get_list_table(), qui ne propose même pas de filtre.

Bienvenue dans le monde merveilleux du code de procédure.

Je suppose que vous devez utiliser JavaScript pour cela.

3
fuxia

Comme @Toscho le dit, la colonne de titre est codée en dur, vous ne pouvez donc pas le changer. Ce que vous pouvez faire, cependant, est de supprimer la colonne et de la redéfinir en tant que colonne personnalisée:

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;
   }

Maintenant, vous devez faire en sorte que la colonne personnalisée se comporte comme l'original :

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 );
            }
        }
     }

Attention, si vous imitez le comportement de base de vos propres fonctions, vous devenez vulnérable aux futures versions de base.

3
cjbj