在我目前正在开发的网站上,我创建了一个主题选项页面(在外观下)。此页面上只有一个文本区域,因此客户端可以添加一些摘要文本,以显示在其帖子上方。
我在这个文本区域使用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/
SO网友:Chip Bennett
如果将以下内容添加到清理回调的顶部,提交时会得到什么输出:
var_dump( $input ); die;
即在此处添加:
function theme_options_validate( $input ) {
var_dump( $input ); die;
比较结果
with 和
without 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
(我认为这与其他建议类似。)
不确定这些是否有用?