为文本区域启用TinyMCE时,无法保存主题选项

时间:2011-07-11 作者:Probocop

在我目前正在开发的网站上,我创建了一个主题选项页面(在外观下)。此页面上只有一个文本区域,因此客户端可以添加一些摘要文本,以显示在其帖子上方。

我在这个文本区域使用TinyMCE,这样他们就可以格式化文本,但如果我启用了TinyMCE,“保存选项”按钮在单击时不会起任何作用。如果我在主题选项文件中注释掉以下几行以禁用TinyMCE,那么它会正确保存。

<?php
    wp_tiny_mce( false , // true makes the editor "teeny"
        array(
            "editor_selector" => "large-text"
        )
    );
?>
注意:TinyMCE加载和显示正确-文本可以格式化,但不能保存。

你知道这是什么原因吗?

我正在使用WordPress 3.2。

Thanks!

Edit: 我的主题选项中的整个代码。php文件如下

<?php

add_action( \'admin_init\', \'theme_options_init\' );
add_action( \'admin_menu\', \'theme_options_add_page\' );

/**
 * Init plugin options to white list our options
 */
function theme_options_init(){
    register_setting( \'client_options\', \'client_theme_options\', \'theme_options_validate\' );
}

/**
 * Load up the menu page
 */
function theme_options_add_page() {
    add_theme_page( __( \'Intro/Welcome Text\', \'client\' ), __( \'Intro/Welcome Text\', \'client\' ), \'edit_theme_options\', \'theme_options\', \'theme_options_do_page\' );
}


/**
 * Create the options page
 */
function theme_options_do_page() {
    global $select_options, $radio_options;

    if ( ! isset( $_REQUEST[\'settings-updated\'] ) )
        $_REQUEST[\'settings-updated\'] = false;

    ?>
    <div class="wrap">
        <?php screen_icon(); echo "<h2>" . __( \' Intro/Welcome Text\', \'client\' ) . "</h2>"; ?>

        <?php if ( false !== $_REQUEST[\'settings-updated\'] ) : ?>
        <div class="updated fade"><p><strong><?php _e( \'Options saved\', \'client\' ); ?></strong></p></div>
        <?php endif; ?>

        <form method="post" action="options.php">
            <?php settings_fields( \'client_options\' ); ?>
            <?php $options = get_option( \'client_theme_options\' ); ?>
            <?php
            wp_tiny_mce( true , // true makes the editor "teeny"
                array(
                    "editor_selector" => "large-text"
                )
            );
            ?>
            <table class="form-table">

                <?php
                /**
                 * A sample textarea option
                 */
                ?>
                <tr valign="top"><th scope="row"><?php _e( \'Intro/Welcome Text\' ); ?></th>
                    <td>
                        <textarea id="client_theme_options[intro_content]" class="large-text" cols="50" rows="10" name="client_theme_options[intro_content]"><?php echo esc_textarea( $options[\'intro_content\'] ); ?></textarea>
                        <label class="description" for="client_theme_options[intro_content]"><?php _e( \'Enter content here to be displayed above the <em><strong>Posts</strong></em>.\', \'client\' ); ?></label>
                    </td>
                </tr>
            </table>

            <p class="submit">
                <input type="submit" class="button-primary" value="<?php _e( \'Save Options\', \'client\' ); ?>" />
            </p>
        </form>
    </div>
    <?php
}

/**
 * Sanitize and validate input. Accepts an array, return a sanitized array.
 */
function theme_options_validate( $input ) {
    global $select_options, $radio_options;

    // Our checkbox value is either 0 or 1
    if ( ! isset( $input[\'option1\'] ) )
        $input[\'option1\'] = null;
    $input[\'option1\'] = ( $input[\'option1\'] == 1 ? 1 : 0 );

    // Say our text option must be safe text with no HTML tags
    $input[\'sometext\'] = wp_filter_nohtml_kses( $input[\'sometext\'] );

    // Our select option must actually be in our array of select options
    if ( ! array_key_exists( $input[\'selectinput\'], $select_options ) )
        $input[\'selectinput\'] = null;

    // Our radio option must actually be in our array of radio options
    if ( ! isset( $input[\'radioinput\'] ) )
        $input[\'radioinput\'] = null;
    if ( ! array_key_exists( $input[\'radioinput\'], $radio_options ) )
        $input[\'radioinput\'] = null;

    // Say our textarea option must be safe text with the allowed tags for posts
    $input[\'sometextarea\'] = wp_filter_post_kses( $input[\'sometextarea\'] );

    return $input;
}

// adapted from http://planetozh.com/blog/2009/05/handling-plugins-options-in-wordpress-28-with-register_setting/

2 个回复
SO网友:Chip Bennett

如果将以下内容添加到清理回调的顶部,提交时会得到什么输出:

var_dump( $input ); die;
即在此处添加:

function theme_options_validate( $input ) {
    var_dump( $input ); die;
比较结果withwithout TinyMCE. 让我们看看发生了什么变化。

另外:这与您遇到的问题没有直接关系(至少,我认为不是),但您的清理回调实际上并没有清理您发送的输入,即。client_theme_options[\'intro_text\']. 这似乎是复制面食的组合,例如消毒功能。

您需要清理您的实际选项,可能需要使用wp_filter_post_kses() 过滤器,因为您允许HTML输入。

EDIT

也许您的问题与this other SO questioner, 因为TinyMCE劫持textarea的方式,textarea数据没有被提交?

该问题的解决方案包括:

在提交呼叫之前。triggerSave()

  • 此建议:
    • 在表单中添加隐藏字段:

      <input type="hidden" id="question_html" name="question_html" />
      
      在发布表单之前,从编辑器中获取数据并将其放入隐藏字段:

      $(\'#question_html\').val(tinyMCE.get(\'question_text\').getContent());
      
      这是another SO question related to the same issue. 建议使用以下脚本代码:

      var editor = tinymce.get( editor_id);
      editor.save();  // writes content back to the textarea
      // you may now use jQuery or editor.getContent(); to acces the content
      
      (我认为这与其他建议类似。)

      不确定这些是否有用?

    SO网友:Phil

    我也有同样的问题,在一天的沮丧之后,我发现如果我添加了wp_tiny_mce 在桌子里面它起作用了。

        <table class="form-table">
    
        <tr>
        <td>
                    <?php
    wp_tiny_mce( false , // true makes the editor "teeny"
      array(
        "editor_selector" => "mce-text",
      \'width\' => \'80%\',
      \'theme\' => \'advanced\',
      \'skin\' => \'wp_theme\'
      )
    );
        ?>
        </td>
        </tr>
    

    结束

    相关推荐

    如何在TinyMCE中插入链接图像

    WordPress附带的TinyMCE编辑器中没有用于从链接插入图像的按钮。我知道您可以使用上载/插入部分来完成此操作。但我们可以说,我不想让用户上传图像,但希望他们能够通过链接插入图像。如果删除上载功能,上载/插入部分将完全消失在WordPress上已经有这样做的方法了吗?