在块编辑器中更改文字

时间:2019-02-08 作者:WebElaine

问题:如何在块编辑器本身中更改文本?

当具有编辑但未发布权限的用户对已发布的帖子进行更改并单击“提交以供审阅”时,块编辑器将显示“帖子还原为草稿”成功消息。我想将此更改为我自己的文本。

此外,在块编辑器的“发布”面板中,有特定于WP核心角色的文本-当具有“编辑但不发布”权限的用户第一次点击“发布”并显示“发布前检查”时,核心消息会显示“当您准备好后,提交您的作品以供审阅,编辑器将能够为您批准。”(我使用自定义角色,因此编辑器无法帮助他们。)

我想更改该文本(用我自己的静态文本替换它),或者,理想情况下,找到一种方法来提取对该帖子类型具有发布权限的所有用户的列表,并输出一个列表,例如,“其中一个用户将能够为您批准:(用户的显示名称列表)。”

我似乎找不到任何关于过滤这些消息的文档,但我肯定忽略了一些东西,因为至少我确信它们是可翻译的。

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

在WordPress 5.0版中,更改“Post Restored to draft.”文本,WordPress引入了一个新的Post类型标签,该标签具有item_reverted_to_draft 而且是defined 作为:

item_reverted_to_draft – 将项目切换到草稿时使用的标签。默认值为“后恢复为草稿”。/”页面已还原为草稿。”

因此,与任何其他post type标签一样—如前一个答案所示,您可以使用post_type_labels_{$post_type} 过滤器以更改标签(文本):

function my_post_type_labels( $labels ) {
    $labels->item_reverted_to_draft = \'Your custom text.\';

    return $labels;
}

add_filter( \'post_type_labels_post\', \'my_post_type_labels\' );   // post
add_filter( \'post_type_labels_my_cpt\', \'my_post_type_labels\' ); // CPT
或者您也可以使用register_post_type_args 过滤器或registered_post_type 措施:

add_filter( \'register_post_type_args\', function( $args, $post_type ){
    $labels = isset( $args[\'labels\'] ) ? (array) $args[\'labels\'] : [];
    if ( in_array( $post_type, [\'post\', \'my_cpt\'] ) ) {
        $labels[\'item_reverted_to_draft\'] = \'Your custom text.\';
    }
    $args[\'labels\'] = $labels;

    return $args;
}, 10, 2 );
更改“准备好后,提交您的作品以供审阅,编辑器将能够为您批准。文本在WordPress 5.0版WordPress中introduced JavaScript i18n支持,这基本上意味着您可以使用__(), _n(), 等,以检索特定字符串/文本的翻译,如下所示:

// Equivalent example in PHP: <?php var_dump( __( \'My string\', \'text-domain\' ) ); ?>
console.log( wp.i18n.__( \'My string\', \'text-domain\' ) );

// Equivalent example in PHP: <?php var_dump( sprintf( _n( \'%s Comment\', \'%s Comments\', 9, \'text-domain\' ), 9 ) ); ?>
console.log( wp.i18n.sprintf( wp.i18n._n( \'%s Comment\', \'%s Comments\', 9, \'text-domain\' ), 9 ) );
正如您所看到的,与PHP不同,在JavaScript中,我们通过wp.i18n 这是翻译库。然而,并非所有功能都可用;例如_e() 功能如中所示<?php _e( \'Text\' ); ?> &mdash;没有wp.i18n._e()wp.i18n._e( \'Text\' ) 将导致错误。

现在,对于该文本&mdash;When you’re ready, submit your work for review, and an Editor will be able to approve it for you. &mdash;您要自定义的,可以在中的块编辑器脚本中找到它wp-includes/js/dist/editor.js 在名为PostPublishPanelPrepublish:

prePublishBodyText = Object(external_this_wp_i18n_["__"])(\'When you’re ready, submit...\');
还有那个external_this_wp_i18n_ 指向wp.i18n; 因此external_this_wp_i18n_["__"]) 相当于wp.i18n.__.

Now here\'s how you can change the text via JavaScript...

使用wp.i18n.setLocaleData():

wp.i18n.setLocaleData({
    \'String to translate #1\': [
        \'Translated string - singular\',
        \'Translated string - plural\'
    ],
    \'String to translate #2\': [
        \'Translated string\'
        // No plural.
    ]
// Omit the text domain (or set it to \'\') if overriding the default WordPress translations.
}, \'text-domain\');
例如,在您的案例中:

wp.i18n.setLocaleData({
    \'When you’re ready, submit your work for review, and an Editor will be able to approve it for you.\': [
        \'Publish when you are ready..\'
    ]
});

And here\'s how you could add the script to the post/page edit screen...

或任何管理页面/屏幕wp-i18n 脚本正在排队。

add_action( \'admin_print_footer_scripts\', function(){
    // Make sure the `wp-i18n` has been "done".
    if ( wp_script_is( \'wp-i18n\' ) ) :
    ?>
        <script>
            // Note: Make sure that `wp.i18n` has already been defined by the time you call `wp.i18n.setLocaleData()`.
            wp.i18n.setLocaleData({
                \'When you’re ready, submit your work for review, and an Editor will be able to approve it for you.\': [
                    \'Publish when you are ready..\'
                ]
            });
        </script>
    <?php
    endif;
}, 11 );
当然,您可以使用其他类似的WordPress挂钩,或者将JavaScript代码放在.js (外部JavaScript)文件,并通过指定wp-i18n (记住,它是一个破折号,而不是一个点)作为依赖项。

显示“其中一个用户将能够为您批准:(用户显示名称列表)。文本

add_action( \'admin_print_footer_scripts\', function(){
    // Make sure the `wp-i18n` has been "done".
    if ( wp_script_is( \'wp-i18n\' ) ) :
        $wp_roles = wp_roles();
        $role_names = [];

        // Get the roles which have the publish_posts capability.
        foreach ( $wp_roles->role_objects as $name => $role ) {
            if ( $role && $role->has_cap( \'publish_posts\' ) ) {
                $role_names[] = $name;
            }
        }

        // Get the users which have the role(s) in the `$role_names`.
        $users = get_users([
            \'role__in\' => $role_names,
        ]);
        $user_names = [];

        foreach ( $users as $user ) {
            $user_names[] = $user->display_name;
        }

        $data = [
            \'When you’re ready, submit your work for review, and an Editor will be able to approve it for you.\' => [
                \'One of these users will be able to approve it for you: \' . implode( \', \', $user_names )
            ],
        ];
    ?>
        <script>
            // Note: Make sure that `wp.i18n` has already been defined by the time you call `wp.i18n.setLocaleData()`.
            wp.i18n.setLocaleData(<?php echo json_encode( $data ); ?>);
        </script>
    <?php
    endif;
}, 11 );
如何测试上述代码段:

将片段添加到主题的functions.php 文件

以任何具有“贡献者”角色的用户身份登录WordPress后端。

创建新帖子并单击“发布”按钮。

  • 你应该看到this.

  • SO网友:Krzysiek Dróżdż

    我现在不能测试它,所以我不能保证它会工作,但是。。。

    1。post还原为draft

    当您在WP代码中搜索该字符串时,只会出现一次。在里面wp-includes/post.php 文件(see on trac) 在里面get_post_type_labels 作用该函数中使用了一个过滤器:post_type_labels_{$post_type}.

    所以像这样的事情应该可以做到:

    function my_custom_post_labels( $labels ) {
        $labels->item_reverted_to_draft  = \'MY OWN TEXT\';
    }
    add_filter( \'post_type_labels_post\', \'my_custom_labels\' );
    

    2。当你准备好了,提交你的作品供审查,编辑将能够为你批准它wp-includes/js/dist/editor.js (第26896行)在这种情况下:

    prePublishBodyText = Object(external_this_wp_i18n_["__"])(\'When you’re ready, submit your work for review, and an Editor will be able to approve it for you.\');
    
    以及external_this_wp_i18n_new JS object introduced in 5.0.

    我对这个机制不是很熟悉,但是。。。只要我正确理解这篇文章,目前没有办法为这些字符串运行PHP过滤器,因此我们将无法使这些字符串成为动态的。。。那一刻我真的开始讨厌古腾堡JS的混乱。。。

    另一方面,如果不必是动态的,可以使用我链接到“翻译”该字符串的文章中描述的方法。

    相关推荐

    添加到数组并通过do_action/Apply_Filters传递它

    作为练习,我正在使用PHPclass to add meta boxes 我在GitHub上找到了。我只是复制了代码,现在我正在玩它来理解它。其工作原理如下:包含该类的文件包含在init中。在该文件内部,但在类外部,有一个空数组$meta_boxes 已初始化之后,使用apply_filters. 我猜是apply_filters 使用而不是do_action 因为后者不返回任何内容——$meta_boxes = apply_filters( \'cmb_meta_boxes\', $meta_boxes