Meta box html在保存后未更新

时间:2020-02-24 作者:hedgehog90

我有一些元框设置,一些是我自己的,一些是在插件中初始化的。

正如标题所示,这些元框在帖子提交后不会以图形方式更新。

这里有一个问题的例子,我有一个元盒,它有一个单一的切换来启用通知。在发送第一个通知并发布帖子后,我取消了复选框并在其上方添加了一点警告。但是,在我完全刷新页面之前,这不会更新。

我对wordpress相当陌生,但这似乎不是正确的行为,因为当我调试代码时,我可以验证是否在save\\u post之后调用了metabox回调。

通过查看Chrome的开发工具中的网络选项卡,我还可以看到,当我“save\\u post”时,它会下载重新生成的HTML,并更新所有元数据库。然而,我在编辑器中没有看到这些元素更新的迹象。

我怀疑这可能是因为新编辑的一个怪癖。

这似乎发生在所有的元框中,有趣的是,除了特色图像之外-我已经设置好了它,因此如果没有设置\\u缩略图\\u id,那么它会默认设置一个,保存帖子后,此图像会显示在特色图像框中。

function cabtv_add_post_options()
{
    // Add our meta box for the "post" post type (default)
    if ( current_user_can("send_notifications") ) {
        $post_types = ["post", "go_live"];
        foreach ($post_types  as $post_type) {
            add_meta_box(
                \'cabtv_notif_on_post\',
                \'Notifications\',
                \'cabtv_notif_on_post_html_view\',
                $post_type,
                \'side\',
                \'high\'
            );
        }
    }
}
add_action(\'admin_init\', \'cabtv_add_post_options\');

function cabtv_notif_on_post_html_view($post)
{
    //wp_nonce_field( \'cabtv_notif_metabox\', \'cabtv_notif_metabox\' );
    $checked = cabtv_should_post_send_notification($post);

    if ( get_post_meta( $post->ID, \'cabtv_notifications_sent\', true ) == "1" ) { ?>
        <div style=\'padding:10px;\'><span style=\'color:red; font-weight:bold;\'>Notifications have already been sent for this post.</span></div>
    <?php } ?>

    <input type="hidden" name="cabtv_meta_box_present" value="true"></input>
    <input type="checkbox" name="cabtv_send_notification" value="true" <?php if ($checked) echo \'checked\'; ?>></input>
    <label>
    <?php echo esc_attr(\'Send notification on \'.($post->post_status === \'publish\' ? \'update\' : \'publish\') ); ?>
    </label>
<?php
}
我们将非常感谢您的帮助。

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

我设法拼凑了一些东西,通过Javascript更新了meta box html,并包装了我在编辑帖子中找到的wp核心调度。js公司:https://wordpress.stackexchange.com/a/391627/183281

SO网友:HK89

选中“通知”复选框时显示通知的代码片段,并在管理中的更新和发布帖子或页面中显示消息

 function cabtv_add_post_options()
    {
        // Add our meta box for the "post" post type (default)    
        $post_types = array("post", "page");

        foreach ($post_types  as $post_type) {

            add_meta_box(\'cabtv_notif_on_post\',\'Notifications\',\'cabtv_notif_on_post_html_view\',$post_type,\'side\',\'high\');
        }

    }
    add_action(\'add_meta_boxes\', \'cabtv_add_post_options\');


    function cabtv_notif_on_post_html_view($post)
    {   
        wp_nonce_field( \'cabtv_notif_metabox\', \'cabtv_notif_metabox\' );

        $checked = get_post_meta( $post->ID, \'cabtv_notifications_sent\', true);
        $check = $checked?\'checked\':\'\';

        if ($checked) { ?>
            <div style=\'padding:10px;\'>
                <span style=\'color:red; font-weight:bold;\'>Notifications have already been sent for this post.</span>
            </div>
        <?php } ?>

        <input type="hidden" name="cabtv_meta_box_present" value="true"></input>
        <input type="checkbox" name="cabtv_send_notification" value="true" <?php echo $check; ?>></input>
        <label>
        <?php echo esc_attr(\'Send notification on \'.($post->post_status === \'publish\' ? \'update\' : \'publish\') ); ?>
        </label>

    <?php
    }




    function save_notice_meta_box_data( $post_id ) {

        // Check if our nonce is set.
        if ( ! isset( $_POST[\'cabtv_notif_metabox\'] ) ) {
            return;
        }

        // Verify that the nonce is valid.
        if ( ! wp_verify_nonce( $_POST[\'cabtv_notif_metabox\'], \'cabtv_notif_metabox\' ) ) {
            return;
        }

        // If this is an autosave, our form has not been submitted, so we don\'t want to do anything.
        if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
            return;
        }

        // Check the user\'s permissions.
        if ( isset( $_POST[\'post_type\'] ) && \'page\' == $_POST[\'post_type\'] ) {

            if ( ! current_user_can( \'edit_page\', $post_id ) ) {
                return;
            }

        }
        else {

            if ( ! current_user_can( \'edit_post\', $post_id ) ) {
                return;
            }
        }

        /* OK, it\'s safe for us to save the data now. */

        // Make sure that it is set.
        if ( ! isset( $_POST[\'cabtv_send_notification\'] ) ) {
            return;
        }

        // Sanitize user input.
        $my_data = sanitize_text_field( $_POST[\'cabtv_send_notification\'] );

        // Update the meta field in the database.
        update_post_meta( $post_id, \'cabtv_notifications_sent\', $my_data?$my_data:\'\');
    }

    add_action( \'save_post\', \'save_notice_meta_box_data\' );
**save\\u notice\\u meta\\u box\\u数据函数代码解释:**

//检查我们的nonce是否已设置。

if ( ! isset( $_POST[\'cabtv_notif_metabox\'] ) ) {
    return;
}
//检查用户的权限。

if ( isset( $_POST[\'post_type\'] ) && \'page\' == $_POST[\'post_type\'] ) {

        if ( ! current_user_can( \'edit_page\', $post_id ) ) {
            return;
        }

    }
    else {

        if ( ! current_user_can( \'edit_post\', $post_id ) ) {
            return;
        }
    }
//确保已设置。

if ( ! isset( $_POST[\'cabtv_send_notification\'] ) ) {
        return;
    }
//更新数据库中的元字段。

 update_post_meta( $post_id, \'cabtv_notifications_sent\',$my_data);
//保存帖子和页面挂钩

add_action( \'save_post\', \'save_notice_meta_box_data\' );

相关推荐

在Gutenberg/JS中使用Dispatch(‘core/EDITOR’).editPost()调用将多个元值设置为数组

我试图通过Gutenberg组件将图像的URL和ID存储在帖子的元字段中,但我很难弄清楚如何将这些多个值存储在一个数组中。我可以毫无问题地将单个值存储为元值。我甚至可以毫无问题地将单个值存储在数组的第一个位置。但我似乎无法找到合适的语法来利用Wordpress将数组存储为元值的能力。总体目标是覆盖在社交媒体上分享帖子时使用的图像。问题是,我需要将URL和ID都传输到PHP挂钩,以便它能够与插件(SEO框架)正常工作。不幸的是,我不能只存储ID,因为我需要URL来在Gutenberg组件中呈现图像。完整组件