Javascript 动态加载wordpress wp_编辑器(ajax)
这是一个答案/解决方案,而不是一个问题,尽管我在我的dev env上尝试过,但仍然可能存在一些bug 我最近尝试在widget/菜单中使用wp_编辑器,经过一些搜索,我没有找到我想要的完整解决方案Javascript 动态加载wordpress wp_编辑器(ajax),javascript,jquery,ajax,wordpress,wysiwyg,Javascript,Jquery,Ajax,Wordpress,Wysiwyg,这是一个答案/解决方案,而不是一个问题,尽管我在我的dev env上尝试过,但仍然可能存在一些bug 我最近尝试在widget/菜单中使用wp_编辑器,经过一些搜索,我没有找到我想要的完整解决方案 在我按小时深入研究wp的代码后,我将在下面分享我的解决方案:可能涉及黑客攻击,但是,我尝试将其最小化 要使wp_编辑器能够在动态html中工作(这意味着在不重新加载页面的情况下,js会更改页面结构),需要注意两个主要问题: 蒂尼姆斯 qucik标签 对于[tinymce]: a。需要正确重置用户界面吗
在我按小时深入研究wp的代码后,我将在下面分享我的解决方案:可能涉及黑客攻击,但是,我尝试将其最小化 要使wp_编辑器能够在动态html中工作(这意味着在不重新加载页面的情况下,js会更改页面结构),需要注意两个主要问题:
- 解决方案是[remove mce instance]->[get-Right mce settings]->[re-init a new mce instance]
- 在js代码中(id表示文本区域id):
- 解决方案是[bind click to button]->在submt::[关闭mce]->[打开提交]
- 在js代码中:
jq('textarea[id="' + id + '"]').closest('form').find('input[type="submit"]').click(function(){ if( getUserSetting( 'editor' ) == 'tmce' ){ var id = mce.find( 'textarea' ).attr( 'id' ); tinymce.execCommand( 'mceRemoveEditor', false, id ); tinymce.execCommand( 'mceAddEditor', false, id ); } return true; });
if ( typeof(QTags) == 'function' ) { jq( '[id="wp-' + id + '-wrap"]' ).unbind( 'onmousedown' ); jq( '[id="wp-' + id + '-wrap"]' ).bind( 'onmousedown', function(){ wpActiveEditor = id; }); QTags( tinyMCEPreInit.qtInit[ id ] ); QTags._buttonsInit(); switchEditors.switchto( jq( 'textarea[id="' + id + '"]' ).closest( '.widget-mce' ).find( '.wp-switch-editor.switch-' + ( getUserSetting( 'editor' ) == 'html' ? 'html' : 'tmce' ) )[0] ); }
function getTemplateWidgetId( id ){ var form = jQuery( 'textarea[id="' + id + '"]' ).closest( 'form' ); var id_base = form.find( 'input[name="id_base"]' ).val(); var widget_id = form.find( 'input[name="widget-id"]' ).val(); return id.replace( widget_id, id_base + '-__i__' ); }
- [获取设置]->[设置鼠标事件]->[重新初始化QTags]
- [切换到当前选项卡模式]
- 以上两种在js代码中都有:
jq('textarea[id="' + id + '"]').closest('form').find('input[type="submit"]').click(function(){ if( getUserSetting( 'editor' ) == 'tmce' ){ var id = mce.find( 'textarea' ).attr( 'id' ); tinymce.execCommand( 'mceRemoveEditor', false, id ); tinymce.execCommand( 'mceAddEditor', false, id ); } return true; });
if ( typeof(QTags) == 'function' ) { jq( '[id="wp-' + id + '-wrap"]' ).unbind( 'onmousedown' ); jq( '[id="wp-' + id + '-wrap"]' ).bind( 'onmousedown', function(){ wpActiveEditor = id; }); QTags( tinyMCEPreInit.qtInit[ id ] ); QTags._buttonsInit(); switchEditors.switchto( jq( 'textarea[id="' + id + '"]' ).closest( '.widget-mce' ).find( '.wp-switch-editor.switch-' + ( getUserSetting( 'editor' ) == 'html' ? 'html' : 'tmce' ) )[0] ); }
function getTemplateWidgetId( id ){ var form = jQuery( 'textarea[id="' + id + '"]' ).closest( 'form' ); var id_base = form.find( 'input[name="id_base"]' ).val(); var widget_id = form.find( 'input[name="widget-id"]' ).val(); return id.replace( widget_id, id_base + '-__i__' ); }
$isAjax=defined('DOING_AJAX')&&DOING_AJAX==true)代码>
关于js值中的默认设置:
mce:tinyMCEPreInit.mceInit
qtags:tinyMCEPreInit.qtInit
如果您尝试使用小部件模式的默认设置,则需要找到默认设置
要获取小部件模板id,请使用js代码:
jq('textarea[id="' + id + '"]').closest('form').find('input[type="submit"]').click(function(){
if( getUserSetting( 'editor' ) == 'tmce' ){
var id = mce.find( 'textarea' ).attr( 'id' );
tinymce.execCommand( 'mceRemoveEditor', false, id );
tinymce.execCommand( 'mceAddEditor', false, id );
}
return true;
});
if ( typeof(QTags) == 'function' ) {
jq( '[id="wp-' + id + '-wrap"]' ).unbind( 'onmousedown' );
jq( '[id="wp-' + id + '-wrap"]' ).bind( 'onmousedown', function(){
wpActiveEditor = id;
});
QTags( tinyMCEPreInit.qtInit[ id ] );
QTags._buttonsInit();
switchEditors.switchto( jq( 'textarea[id="' + id + '"]' ).closest( '.widget-mce' ).find( '.wp-switch-editor.switch-' + ( getUserSetting( 'editor' ) == 'html' ? 'html' : 'tmce' ) )[0] );
}
function getTemplateWidgetId( id ){
var form = jQuery( 'textarea[id="' + id + '"]' ).closest( 'form' );
var id_base = form.find( 'input[name="id_base"]' ).val();
var widget_id = form.find( 'input[name="widget-id"]' ).val();
return id.replace( widget_id, id_base + '-__i__' );
}
因此,您可以通过以下方式获得设置:
对于mce:
var init;
if( typeof tinyMCEPreInit.mceInit[ id ] == 'undefined' ){
init = tinyMCEPreInit.mceInit[ id ] = tinymce.extend( {}, tinyMCEPreInit.mceInit[ getTemplateWidgetId( id ) ] );
}else{
init = tinyMCEPreInit.mceInit[ id ];
}
对于Qtags:
var qInit;
if( typeof tinyMCEPreInit.qtInit[ id ] == 'undefined' ){
qInit = tinyMCEPreInit.qtInit[ id ] = jq.extend( {}, tinyMCEPreInit.qtInit[ getTemplateWidgetId( id ) ] );
qInit['id'] = id;
}else{
qInit = tinyMCEPreInit.qtInit[ id ];
}
有关完整的代码示例,请检查:
如果有人想在管理员的菜单漫游中使用wp_编辑器,原则应该是相同的
如果您有任何问题或更好的解决方案,请发表意见,谢谢。我也遇到过类似的问题。我用以下方法解决了这个问题
1.添加了以下过滤器以在主页面中始终以可视模式打开编辑器
add_filter( 'wp_default_editor', create_function('', 'return "tinymce";') );
2.在Ajax中,以下内容用于编辑器
wp_editor( $content, "editor_ajax", array('textarea_name'=>"content_ajax",'quicktags' => array('buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close')));
3.在Ajax中,添加了以下JS代码内容
<script src="<?php bloginfo('home')?>/wp-includes/js/quicktags.min.js"</script>
<script>
jQuery(document).ready(function(){
ed_id = "editor_ajax";
quicktags({id : ed_id,buttons:"strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,dfw"});
tinyMCE.execCommand('mceAddEditor', false, fullId);
});
</script>
工作解决方案:
p、 美国。你应该在WP.SE询问:
在wordpress中添加操作,比如说My_action\u Name
(另请注意,textarea IDMy_textarea ID\u 22
):
现在,在仪表板中执行此功能(注意,使用我的文本区域ID\u 22
和我的操作\u名称
):
function start\u Ajax\u request(){
警惕(“我已经开始”);
My_New_Global_Settings=tinyMCEPreInit.mceInit.content;//获取默认Wordpress设置(我无法确认,但如果需要更改目标ID,请添加此行:My_New_Global_Settings.selector=“My_TextAreaID_22”)
jQuery.post(ajaxurl,
{操作:“我的操作名称”,默认文本:“Hello World”},
功能(响应、状态){
警惕(“我已经完成”);
tinymce.init(我的新全局设置);
tinyMCE.execCommand('mceAddEditor',false,“My_TextAreaID_22”);
快速标记({id:“My_TextAreaID_22”});
}
);
}
启动Ajax请求();//<---执行
您必须执行新的QTags(tinyMCEPreInit.qtInit[id])代码>。检查浏览器控制台中的QTags.instances
,查看此处显示的原因: