it-swarm.com.de

Filtern Sie Übersetzungen (Gettext-Strings) auf bestimmten Admin-Seiten

Ich versuche, eine Zeichenfolge mit dem Filter gettext ( source ) zu ersetzen:

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

Ich möchte, dass es nur für einen bestimmten Beitragstyp (in admin) funktioniert. Also habe ich versucht get_current_screen() innerhalb der Funktion:

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

Aber ich bekomme eine Fehlermeldung:

Schwerwiegender Fehler: Aufruf der undefinierten Funktion get_current_screen()

Bei mehreren Tests habe ich verstanden, dass gettext nicht der richtige Filter ist, um die Funktion get_current_screen() auszulösen.

Wie kann ich das dann tun, und zwar nur für meinen benutzerdefinierten Beitragstyp?

5
Mayeenul Islam

Laut mit dem Codex muss get_current_screen() später als admin_init hook verwendet werden. Nach ein paar Tests scheint es am sichersten zu sein, current_screen action hook anstelle von get_current_screen() zu verwenden:

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;

}

Sie können den Filter wiederverwenden, wenn Sie möchten, beispielsweise im Frontend für "mycpt" -Archive:

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

get_current_screen() ist ein Schmerz, ich benutze den folgenden Code, um ihn zu vermeiden/umzubrechen:

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

Ihre Funktion würde dann werden:

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

Es ist auch nützlich, um einen Kurzschluss zwischen benutzerdefinierten admin_inits zu erstellen oder Ihre Einstellungen nur auf Ihrer eigenen Einstellungsseite zu registrieren.

2
bonger