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?
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 );
}
});
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_init
s ou pour enregistrer uniquement vos paramètres sur votre propre page de paramètres.