web-dev-qa-db-fra.com

Filtrer les traductions (chaînes gettext) sur les pages d'administration spécifiques

J'essaie de remplacer une chaîne en utilisant le filtre gettext ( source ):

function theme_change_comments_label( $translated_text, $untranslated_text, $domain ) {
    if( stripos( $untranslated_text, 'comment' !== FALSE ) ) {
        $translated_text = str_ireplace( 'Comment', 'Review', $untranslated_text ) ;
    }
    return $translated_text;
}
is_admin() && add_filter( 'gettext', 'theme_change_comments_label', 99, 3 );

Je veux que cela ne fonctionne que sur un type de message spécifique (en admin). J'ai donc essayé get_current_screen() dans la fonction:

function theme_change_comments_label( $translated_text, $untranslated_text, $domain ) {
    $screen = get_current_screen();
    if( $screen->post_type == 'mycpt' ) {
        if( stripos( $untranslated_text, 'comment' !== FALSE ) ) {
            $translated_text = str_ireplace( 'Comment', 'Review', $untranslated_text ) ;
        }
        return $translated_text;
    }
}
is_admin() && add_filter( 'gettext', 'theme_change_comments_label', 99, 3 );

Mais je reçois une erreur:

Erreur fatale: Appel de la fonction non définie get_current_screen()

Avec plusieurs tests que j'ai compris, gettext n'est pas le filtre correct pour déclencher la fonction get_current_screen().

Alors comment puis-je faire cela, spécifique à mon type de message personnalisé uniquement?

5
Mayeenul Islam

Selon avec le codex , get_current_screen() doit être utilisé plus tard que admin_init hook. Après quelques tests, il semble que le moyen le plus sûr consiste à utiliser le crochet d'action current_screen au lieu de get_current_screen():

add_action('current_screen', 'current_screen_callback');
function current_screen_callback($screen) {
    if( is_object($screen) && $screen->post_type == 'mycpt' ) {
        add_filter( 'gettext', 'theme_change_comments_label', 99, 3 );
    }
}

function theme_change_comments_label( $translated_text, $untranslated_text, $domain ) {

    if( stripos( $untranslated_text, 'comment' ) !== FALSE ) {
        $translated_text = str_ireplace( 'Comment', 'Review', $untranslated_text ) ;
    }

    return $translated_text;

}

Vous pouvez réutiliser le filtre si vous le souhaitez, par exemple dans le frontal des archives "mycpt":

add_action('init', function() {
    if( is_post_type_archive( 'mycpt' ) ) {
        add_filter( 'gettext', 'theme_change_comments_label', 99, 3 );
    }
});
5
cybmeta

get_current_screen() est une douleur, j'utilise le code suivant pour éviter/envelopper:

/*
 * Convenience function to tell if we're on a specified page.
 */
function theme_is_current_screen( $base = null, $post_type = null ) {
    if ( ! $base && ! $post_type ) {
        return false;
    }
    $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
    if ( ! $screen ) {
        // Fake it.
        $screen = new StdClass;
        $screen->post_type = $screen->base = '';

        global $pagenow;
        if ( $pagenow == 'admin-ajax.php' ) {
            if ( isset( $_REQUEST['action'] ) ) {
                $screen->base = $_REQUEST['action'];
            }
        } else {
            $screen->post_type = isset( $_REQUEST['post_type'] ) ? $_REQUEST['post_type'] : '';
            if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' || $pagenow == 'edit.php' ) {
                $screen->base = preg_replace( '/[^a-z].+$/', '', $pagenow );
                if ( ! $screen->post_type ) {
                    $screen->post_type = get_post_type( theme_get_post_id() );
                }
            } else {
                $page_hook = '';
                global $plugin_page;
                if ( ! empty( $plugin_page ) ) {
                    if ( $screen->post_type ) {
                        $the_parent = $pagenow . '?post_type=' . $screen->post_type;
                    } else {
                        $the_parent = $pagenow;
                    }
                    if ( ! ( $page_hook = get_plugin_page_hook( $plugin_page, $the_parent ) ) ) {
                        $page_hook = get_plugin_page_hook( $plugin_page, $plugin_page );
                    }
                }
                $screen->base = $page_hook ? $page_hook : pathinfo( $pagenow, PATHINFO_FILENAME );
            }
        }
    }
    // The base type of the screen. This is typically the same as $id but with any post types and taxonomies stripped.
    if ( $base ) {
        if ( ! is_array( $base ) ) $base = array( $base );
        if ( ! in_array( $screen->base, $base ) ) {
            return false;
        }
    }
    if ( $post_type ) {
        if ( ! is_array( $post_type ) ) $post_type  = array( $post_type );
        if ( ! in_array( $screen->post_type, $post_type ) ) {
            return false;
        }
    }
    return true;
}

/*
 * Attempt to determine post id in uncertain (admin) situations.
 * Based on WPAlchemy_MetaBox::_get_post_id().
 */
function theme_get_post_id() {
    global $post;

    $ret = 0;

    if ( ! empty( $post->ID ) ) {
        $ret = $post->ID;
    } elseif ( ! empty( $_GET['post'] ) && ctype_digit( $_GET['post'] ) ) {
        $ret = $_GET['post'];
    } elseif ( ! empty( $_POST['post_ID'] ) && ctype_digit( $_POST['post_ID'] ) ) {
        $ret = $_POST['post_ID'];
    }

    return $ret;
}

Votre fonction deviendrait alors:

function theme_change_comments_label( $translated_text, $untranslated_text, $domain ) {
    if( theme_is_current_screen( null, 'mycpt' ) ) {
        if( stripos( $untranslated_text, 'comment' ) !== FALSE ) {
            $translated_text = str_ireplace( 'Comment', 'Review', $untranslated_text ) ;
        }
    }
    return $translated_text;
}
is_admin() && add_filter( 'gettext', 'theme_change_comments_label', 99, 3 );

C'est également utile pour court-circuiter le type personnalisé admin_inits ou pour enregistrer uniquement vos paramètres sur votre propre page de paramètres.

2
bonger