gpt4 book ai didi

javascript - 动态加载 wordpress wp_editor (ajax)

转载 作者:搜寻专家 更新时间:2023-11-01 04:54:25 26 4
gpt4 key购买 nike

这是一个答案/解决方案而不是一个问题,即使我在我的开发环境中尝试过,仍然可能存在一些错误。

我最近尝试在小部件/菜单中使用wp_editor,经过一番搜索,我没有找到我想要的完整解决方案。

在我按小时深入研究 wp 的代码后,我会在下面分享我的解决方案:

最佳答案

可能涉及黑客攻击,但是,我尽量减少它们。

要使wp_editor能够在动态html中工作(即无需重新加载页面,js改变页面结构),有两个主要问题需要注意:

  1. 微信
  2. 快速标签

对于 [tinymce]:

一个。需要正确重置用户界面

  • 解决方案是 [删除 mce 实例] -> [获取正确的 mce 设置] -> [重新初始化一个新的 mce 实例]

  • 在js代码中(id表示textarea id):

    tinymce.execCommand('mceRemoveEditor', true, id);
    var init = tinymce.extend( {}, tinyMCEPreInit.mceInit[ id ] );
    try { tinymce.init( init ); } catch(e){}

提交前需要数据写回textarea

  • 解决方案是[将点击绑定(bind)到按钮] -> on 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;
    });

对于[快速标签]:

一个。重新初始化标签

  • [获取设置] -> [设置鼠标事件] -> [重新初始化QTags]

切换到适当的选项卡(mce 选项卡或快速标记选项卡)

  • [切换到当前标签页模式]

  • 上面的js代码:

    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] );
    }

另外,请记住,如果你使用ajax,每次回传mce UI,你需要在你的js中重新做[reset mce UI]和[Qtags]。一个简单的解决方案是在您回发 html 中使用 js 代码,并在 php 中检测:

$isAjax = defined( 'DOING_AJAX' ) && DOING_AJAX == true );

关于js值中的默认设置:

  1. mce : tinyMCEPreInit.mceInit

  2. qtags : tinyMCEPreInit.qtInit

如果您尝试使用小部件模式的默认设置,您需要找到默认设置。

获取widget模板id,在js代码中:

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__' );
}

因此您可以通过以下方式获取设置:

  1. 对于 mce:

    var init;
    if( typeof tinyMCEPreInit.mceInit[ id ] == 'undefined' ){
    init = tinyMCEPreInit.mceInit[ id ] = tinymce.extend( {}, tinyMCEPreInit.mceInit[ getTemplateWidgetId( id ) ] );
    }else{
    init = tinyMCEPreInit.mceInit[ id ];
    }
  2. 对于 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 ];
    }

完整代码示例,请查看:https://github.com/hezachary/wordpress-wysiwyg-widget/blob/master/widget_wp_editor.class.php

如果有人想在管理菜单中使用wp_editor,原理应该是一样的。

如果您有任何问题或更好的解决方案,请评论,谢谢。

关于javascript - 动态加载 wordpress wp_editor (ajax),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21519322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com