以编辑者身份登录时动态块属性的错误编码问题

时间:2020-10-15 作者:sosere

作为编辑器时,动态块属性(字符串)中的德语UMLAUT在数据库中的编码/保存不正确,但如果由管理员编辑,则正确。

如何复制:

创建dynamich块插件:testblock。php

    <?php
    /**
     * Plugin Name: Gutenberg wrong encoding example dynamic
     */
     
    function test_callback( $block_attributes, $content ) {
    
        return \'<p>\'.$block_attributes[\'dataTest\'].\'</p>\';
    }
     
    function wrong_encoding_dynamic() {
    
        wp_register_script(
            \'test\',
                    plugins_url( \'testblock.js\',__FILE__ ), 
                    
                    array( \'wp-editor\', \'wp-i18n\', \'wp-element\', \'wp-components\', \'wp-blocks\' ),
                    \'1.0.0\',
                    true
        );
     
        register_block_type( \'dev/test\', array(
            \'editor_script\' => \'test\',
            \'render_callback\' => \'test_callback\'
        ) );
     
    }
    add_action( \'init\', \'wrong_encoding_dynamic\' );
测试块。js公司:

( function( blocks, element, data ) {
    var el = element.createElement,
        registerBlockType = blocks.registerBlockType;
const {
        TextControl,

    } = wp.components;

 
    registerBlockType( \'dev/test\', {
        title: \'Dev: Test\',
        icon: \'megaphone\',
        category: \'widgets\',
        attributes: {
            dataTest:{
                    type:\'string\',
                    default:\'ÄÖÜäöüß\'
                },
        },
        edit: function( props ) {
            return el(TextControl,{
                                onChange: ( value ) => {    
                                                        props.setAttributes({dataTest:value});
                                                        },
                                          }
         );
    }
});
 }(
    window.wp.blocks,
    window.wp.element,
    window.wp.data,
 ) );
以(超级)管理员身份登录,激活插件,创建新帖子,添加块并键入一些UMLAUT。保存或发布帖子(&P);查看输出,然后注销。以编辑器身份登录,重复步骤2,比较输出db中的帖子内容示例:

<!-- wp:dev/test {"dataTest":"u00c4u00d6u00dcu00e4u00f6u00fcu00dfu00f6"} /-->
但应该是:

<!-- wp:dev/test {"dataTest":"ÄÖÜäöüßö"} /--> 
知道怎么了吗?

1 个回复
最合适的回答,由SO网友:sosere 整理而成

解决它:这是一个兼容性问题。在Gutenberg之前的几天,可以通过以下方式更新post bevore Save:

// get post object by id
$post_obj = get_post($post_id);         
// do something with post_content
    
// unhook this function so it doesn\'t loop infinitely
remove_action( \'save_post\', array($this, \'replace_postcontent\') );
// update the post, which calls save_post again
wp_update_post( array( \'ID\' => $post_obj->ID, \'post_content\' => $post_obj->post_content ) );
// re-hook this function
add_action( \'save_post\', array($this, \'replace_postcontent\') );
它仍然可以工作,但会导致如上所述的问题。解决方案就是使用post对象。而不是:wp_update_post( array( \'ID\' => $post_obj->ID, \'post_content\' => $post_obj->post_content ) );使用:wp_update_post( $post_obj );