脚本和标签不会保存或从我的自定义元框中输出

时间:2018-08-23 作者:Mark.C

我正在复制此教程以制作自己的自定义元框https://www.sitepoint.com/adding-meta-boxes-post-types-wordpress/

它工作得很好,但是我需要能够在这个元框中输入脚本标记,保存脚本并将其输出到页面上。

当我输入脚本标记或div标记之类的内容时,它将清除元框字段,而不会在更新页面后保存或输出我输入的内容。

我注意到代码有以下内容:

// Sanitize user input.
$my_data = sanitize_text_field( $_POST[\'global_notice\'] );
但即使我删除了这一行,它仍然不会在元框中保存或输出我的脚本。

我还需要做些什么才能使脚本和标记正常工作?这不起作用有什么原因吗?

非常感谢。

*编辑

下面是我在一个插件中使用的完整代码,该插件用于创建metabox,并提供了一个用于输出metabox内容的短代码。

<?php
   /*
   Plugin Name: VBO Tickets Plugin Embed
   Plugin URI: https://www.vbotickets.com
   Description: Add your plugin code to any page or post on your WordPress site.
   Version: 0.1
   Author: VBO Tickets
   */

function global_notice_meta_box() {

    $screens = get_post_types();

    foreach ( $screens as $screen ) {
        add_meta_box(
            \'global-notice\',
            __( \'VBO Plugin Embed\', \'vbotickets\' ),
            \'global_notice_meta_box_callback\',
            $screen
        );
    }
}

add_action( \'add_meta_boxes\', \'global_notice_meta_box\' );

function global_notice_meta_box_callback( $post ) {

    // Add a nonce field so we can check for it later.
    wp_nonce_field( \'global_notice_nonce\', \'global_notice_nonce\' );

    $value = get_post_meta( $post->ID, \'_global_notice\', true );

    echo \'<p><strong>Paste your VBO plugin embed code in the text area below:</strong></p>\';

    echo \'<textarea style="width:100%;min-height:150px;" id="global_notice" name="global_notice">\' . esc_attr( $value ) . \'</textarea>\';

    echo \'<p><strong>Next, copy/paste</strong> <code>[vbo-plugin-embed]</code> <strong>into the content area where you want the plugin to load on this page.</strong></p>\';
}

/**
 * When the post is saved, saves our custom data.
 *
 * @param int $post_id
 */
function save_global_notice_meta_box_data( $post_id ) {

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

    // Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $_POST[\'global_notice_nonce\'], \'global_notice_nonce\' ) ) {
        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[\'global_notice\'] ) ) {
        return;
    }

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

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

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

// Add shortcode [vbo-plugin-embed]
function vbo_embed_sc( $atts ){

    global $post;

    // retrieve the global notice for the current post
    $global_notice = esc_attr( get_post_meta( $post->ID, \'_global_notice\', true ) );

    return $global_notice;
}
add_shortcode( \'vbo-plugin-embed\', \'vbo_embed_sc\' );
这是我正在测试的URLhttps://demo.vbotickets.com/photos/

现在的问题是,我已经将scrtips/HTML保存在元框中,但输出是纯文本,而不是实际运行代码/脚本。还有什么方法可以运行它吗?

谢谢

2 个回复
SO网友:Jerrick

您可以使用“esc\\u attr()”来转义数据,这就是它被转换为计划文本的原因。如果您使用echo,它可能会工作。但是,您需要将脚本标记保存到数据库中。

我和你一样仍在学习之旅中,但以下是我将要做的。

保存数据

//$my_data = sanitize_text_field( $_POST[\'global_notice\'] );
//$my_data = $_POST[\'global_notice\'];
$my_data = htmlspecialchars($_POST[\'global_notice\']);
然后输出数据

if(!empty($global_notice)) {
    $myvar = htmlspecialchars_decode($global_notice);
    return $myvar;
}
如果“return”不起作用,可以使用“echo”。

希望这有帮助。

此外,在创建快捷代码时,您可能希望了解ob\\U start();和return\\u ob\\u clean();如果您的短代码显示在前端的错误位置。您可以始终使用相同的代码作为模板文件供参考。

SO网友:De Coder

您不能只删除该行而跳过数据的清理。线路为:$my_data = sanitize_text_field( $_POST[\'global_notice\'] );如果将其删除,则不会向发送任何内容$my_data

对于测试,请尝试将其替换为:$my_data = $_POST[\'global_notice\'];

我建议,对于一个有生命的环境,你应该以某种方式对其进行消毒。

结束

相关推荐

如何在编辑或添加帖子屏幕上添加Metabox来拉取自定义帖子列表(任意两个)?

我想将metabox添加到自定义帖子列表中,并在编辑或添加帖子屏幕上选择任意两个。最后,当文章发布时,将其显示在单个文章页面上。请帮帮我!任何帮助都将不胜感激。。。。 add_action( \'add_meta_boxes\', function () { add_meta_box( \'yourcustom_sectionid\', __( \' Custom Offer Section\', \'yourtextdomain\'