好的,所以这里的主要问题最终只是wp_filter_post_kses
可能是过滤掉iFrame。但我也想谈谈你处理表格的方式。您没有使用AJAX,AJAX是通过Javascript将请求发送到服务器,但您正在尝试挂接AJAX挂钩,然后在admin post上手动运行它们。php?这一切都是一团糟。
下面是一些可以在实际AJAX中实现所需功能的工作代码,下面我将介绍一些需要注意的事项:
function wpse_211908_add_dashboard_widgets() {
wp_add_dashboard_widget(
\'wpse_211908_stream_options\',
\'Stream Settings\',
\'wpse_211908_stream_options_widget\'
);
}
add_action(\'wp_dashboard_setup\', \'wpse_211908_add_dashboard_widgets\' );
function wpse_211908_stream_options_widget() {
$code = stripcslashes( get_option( \'stream_code\' ) );
$status = get_option( \'stream_status\' );
?>
<form id="stream_options" method="post">
<p><textarea name="stream_code" rows="5" class="widefat"><?php echo esc_textarea( $code ); ?></textarea>
<p><label><input type="checkbox" name="stream_status" value="1" <?php checked( $status, \'1\' ); ?>> Live</label>
<?php wp_nonce_field( \'stream_options_ajax_call\' ); ?>
<input type="hidden" name="action" value="wpse_211908_save_stream_options">
<p><input type="submit" class="button button-primary" value="Save">
</form>
<script>
( function($) {
var $form = $( \'#stream_options\' );
var $button = $form.find( \'input[type="submit"]\' );
$form.on( \'submit\', function(e) {
e.preventDefault();
$button.prop( \'disabled\', true ).attr( \'value\', \'Saving...\' );
$.ajax( {
url: window.ajaxurl,
method: \'post\',
data: $form.serialize(),
complete: function() {
$button.prop( \'disabled\', false );
},
success: function() {
$button.attr( \'value\', \'Saved\' );
},
error: function() {
$button.attr( \'value\', \'Save\' );
},
} );
} );
$form.on( \'input change\', function() {
$button.attr( \'value\', \'Save\' );
} );
} )( jQuery );
</script>
<?php
}
function wpse_211908_save_stream_options() {
if ( empty( $_POST[\'_wpnonce\'] ) || ! wp_verify_nonce( $_POST[\'_wpnonce\'], \'stream_options_ajax_call\' ) ) {
http_response_code(403);
exit();
}
if ( ! current_user_can( \'manage_options\' ) ) {
http_response_code(403);
exit();
}
update_option( \'stream_code\', $_POST[\'stream_code\'] );
$status = isset( $_POST[\'stream_status\'] ) ? \'1\' : \'0\';
update_option( \'stream_status\', $status );
wp_die();
}
add_action( \'wp_ajax_wpse_211908_save_stream_options\', \'wpse_211908_save_stream_options\', 99 );
首先,请注意,为了避免冲突,我在所有函数和所有将与WordPress共享的变量前面加了前缀。这是一个很好的做法,我推荐它。名称如下
add_dashboard_widgets
只是乞求引起冲突。
请注意script
小部件中的标记。这是将发送AJAX请求的JavaScript。因为我有一个隐藏字段名为action
具有值wpse_211908_save_stream_options
, 这意味着它将成为$_POST[\'action\']
我可以通过使用wp_ajax_wpse_211908_save_stream_options
钩使用Javascript进行提交意味着提交时不需要加载页面。
同样在我使用的widget通知中esc_textarea()
确保$code
变量不会破坏小部件的HTML。注意我使用checked()
作为输出选中属性的更简单方法。
第二个函数是处理AJAX请求的函数。请注意,我可以在一个函数中处理所有内容,而不是添加检查字段和触发操作的操作。在这里,如果nonce没有验证,或者用户没有更新设置的权限,我会发送403个错误。
你会注意到,我对$_POST[\'stream_code\']
. 如果我们已经在检查提交的HTML是否为可信用户,则无需对其进行过滤。如果要进一步锁定此项,可以使用wp_kses
, 但您需要提供自己的允许元素列表,因为iFrame将被wp_filter_post_kses()
.
然后请注意$_POST[\'stream_status\']
我只需检查它是否存在(使用AJAX,如果不检查,它将根本无法通过),然后手动设置为\'0\'
或\'1\'
. wp_kses()
对复选框进行消毒是相当过分的。
最后,要在前端使用HTML,只需使用: