通过Ajax插件加载Wordpress编辑器

时间:2014-09-08 20:29:32

标签: javascript php ajax wordpress-plugin wordpress

我已经研究了有关此主题的stackoverflow上的几个类似问题,这些问题已经有了答案。

有些答案似乎没有完全奏效,有些答案就在我的头上。

我已经阅读并重新编写了一周以上的代码,所以我会尝试再次询问更多细节而不是其他问题。

我写了一个非常简单的WordPress插件,其中唯一的目的是通过ajax加载一个功能齐全的编辑器。

以下是此插件的截屏视频(有错误): http://screencast.com/t/eyrTdbUy

我认为,如果我的问题得到解答,它将对很多人有所帮助。

这正是插件的作用。

  1. 它加载我的自定义页面模板而不是主题模板。在此模板中,有一个使用wp_editor函数创建的编辑器(用于加载所需的文件)和一个用于添加新编辑器的链接。

  2. 当您单击“添加编辑器”链接时,将使用wp_editor函数通过ajax创建一个新编辑器,然后使用javascript进行初始化,并添加新链接以添加另一个。

  3. 仅在用户登录时才有效。

    我不建议在您的有效网站上安装此内容,因为它会接管您的网页。这个插件仅作为示例,因此它只应安装在测试站点上。

    以下是问题......

    1. 加载了ajax的编辑器的第一个实例可以正常工作,但是当您单击选项卡从视觉切换到文本时会出现以下错误 “TypeError:e未定义” “TypeError:c未定义”
    2. 加载第一个新编辑器时也会出现“TypeError:e未定义”。

      1. 加载第一个实例后,无法添加其他编辑器。
      2. 所以我的问题是......我的代码出了什么问题?

        该插件由4个文件组成。

        文件1是插件文件“load_editor.php”(它只包含这些功能):

            include('functions.php');
        

        文件2是函数文件“functions.php”:

        <?
        // load custom editor template 
        function load_editor_template( $template )
        {
            $template = plugin_dir_path( __FILE__ ) . 'template.php';
        
            return $template;
        }
        
        add_filter( 'template_include', 'load_editor_template' );
        
        // load javascript 
        function load_editor_scripts() {
            wp_enqueue_script( 'load_editor', plugins_url() . '/load_editor/js/load_editor.js', array(), '', true );
            wp_enqueue_script( 'jquery');
        }
        
        add_action( 'wp_enqueue_scripts', 'load_editor_scripts' );
        
        // create new editor
        function load_editor_new_editor() {
            $id      = $_POST['id'];
            $number  = $_POST['number'];
            $next    = $number + 1;
            $full_id = $id.$number;
        
            echo "<h1>Editor $number</h1>";
        
            $content = '<p>This is example content.</p>';
            wp_editor($content, $full_id, array('textarea_rows' => 3));
        
            // initiate new editor
            echo "<script>
        tinyMCE.execCommand('mceAddEditor', true, $full_id);
        tinyMCE.init(tinyMCEPreInit.mceInit[$full_id]);
        </script>";
        
            // create "add new" text
            echo "<div><a onclick=\"load_new_editor('editor', $next);\" href='javascript:void(0);'>Click here</a> to add another editor</div>";
        
            die();
        }
        
        add_action( 'wp_ajax_load_editor_new_editor', 'load_editor_new_editor' );
        

        文件3是模板文件“template.php”:

        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Load Editor</title>
        <?php wp_head(); ?>
        </head>
        
        <body>
        <? wp_editor('Ecample content', 'id',  array('textarea_rows' => 3)); ?>
        
        <div id="add"><a onClick="load_new_editor('editor', 1);" href="javascript:void(0);">Click here</a> to add an editor</div>
        <div id="editor_container">
        <!-- Editors will load here -->
        </div>
        
        <script>
        <?
        echo 'ajaxurl = "'.admin_url('admin-ajax.php').'";';
        ?>
        </script>
        <?php wp_footer(); ?>
        </body>
        </html>
        

        文件4是javascript文件“load_editor.js”:

        function load_new_editor(id, number){
            // remove click to add
            jQuery('#add').remove();
        
            var fullId = id + number;
        
            var data = {
                'action': 'load_editor_new_editor',
                'number': number,
                'id': id
            };
        
            jQuery.post(ajaxurl, data, function(response) {
        
                //add new editor
                jQuery('#editor_container').append(response);
        
            });
        }
        

        我也把它放在github上: enter link description here

        非常感谢您提供任何帮助。我一直试图让它长时间工作,它正在煎炸我的大脑。我甚至通过elance聘请了一名程序员,他无法像我那样得到它。

2 个答案:

答案 0 :(得分:3)

这是我能想到的最好的东西,我认为这对我来说已经足够了。

除了快速标记之外,一切正常,我可以在没有它们的情况下生活。

我从funtions.php中删除了javascript

<?
// load custom editor template 
function load_editor_template( $template )
{
    $template = plugin_dir_path( __FILE__ ) . 'template.php';

    return $template;
}

add_filter( 'template_include', 'load_editor_template' );

// load javascript 
function load_editor_scripts() {
    wp_enqueue_script( 'load_editor', plugins_url() . '/load_editor/js/load_editor.js', array(), '', true );
    wp_enqueue_script( 'jquery');
}

add_action( 'wp_enqueue_scripts', 'load_editor_scripts' );

// create new editor
function load_editor_new_editor() {
    $id      = $_POST['id'];
    $number  = $_POST['number'];
    $next    = $number + 1;
    $full_id = $id.$number;

    echo "<h1>Editor $number</h1>";

    $content = '<p>This is example content.</p>';
    wp_editor($content, $full_id, array('textarea_rows' => 3));

    // create "add new" text
    echo "<div id='add'><a onclick=\"load_new_editor('editor', $next);\" href='javascript:void(0);'>Click here</a> to add another editor</div>";

    die();
}

add_action( 'wp_ajax_load_editor_new_editor', 'load_editor_new_editor' );

然后我在load_editor.js上更改了以下内容

  1. 添加了quicktags功能以使标签无错误地工作
  2. 使用WordPress使用的设置调用tinymce.init
  3. 我认为就是这样。

    // JavaScript Document
    
    function load_new_editor(id, number){
        // remove click to add
        jQuery('#add').remove();
    
        var fullId = id + number;
    
        var data = {
            'action': 'load_editor_new_editor',
            'number': number,
            'id': id
        };
    
        jQuery.post(ajaxurl, data, function(response) {
    
            //add new editor
            jQuery('#editor_container').append(response);
    
            // this is need for the tabs to work
            quicktags({id : fullId});
    
            // use wordpress settings
            tinymce.init({
            selector: fullId,
    
            theme:"modern",
            skin:"lightgray",
            language:"en",
            formats:{
                            alignleft: [
                                {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles: {textAlign:'left'}},
                                {selector: 'img,table,dl.wp-caption', classes: 'alignleft'}
                            ],
                            aligncenter: [
                                {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles: {textAlign:'center'}},
                                {selector: 'img,table,dl.wp-caption', classes: 'aligncenter'}
                            ],
                            alignright: [
                                {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles: {textAlign:'right'}},
                                {selector: 'img,table,dl.wp-caption', classes: 'alignright'}
                            ],
                            strikethrough: {inline: 'del'}
                        },
                        relative_urls:false,
                        remove_script_host:false,
                        convert_urls:false,
                        browser_spellcheck:true,
                        fix_list_elements:true,
                        entities:"38,amp,60,lt,62,gt",
                        entity_encoding:"raw",
                        keep_styles:false,
                        paste_webkit_styles:"font-weight font-style color",
                        preview_styles:"font-family font-size font-weight font-style text-decoration text-transform",
                        wpeditimage_disable_captions:false,
                        wpeditimage_html5_captions:true,
                        plugins:"charmap,hr,media,paste,tabfocus,textcolor,fullscreen,wordpress,wpeditimage,wpgallery,wplink,wpdialogs,wpview",
                        selector:"#" + fullId,
                        resize:"vertical",
                        menubar:false,
                        wpautop:true,
                        indent:false,
                        toolbar1:"bold,italic,strikethrough,bullist,numlist,blockquote,hr,alignleft,aligncenter,alignright,link,unlink,wp_more,spellchecker,fullscreen,wp_adv",toolbar2:"formatselect,underline,alignjustify,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help",
                        toolbar3:"",
                        toolbar4:"",
                        tabfocus_elements:":prev,:next",
                        body_class:"id post-type-post post-status-publish post-format-standard",
    
    });
    
    
            // this is needed for the editor to initiate
            tinyMCE.execCommand('mceAddEditor', false, fullId); 
    
        });
    }
    

    这是一个有效的截屏视频。 http://screencast.com/t/Psd9IVVY

    如果有人知道如何显示快速标签,我很想知道。

    另外,如果您发现我的代码有问题,请告诉我。

    我已经更新了github,如果你想在这里下载它: https://github.com/ccbgs/load_editor

答案 1 :(得分:0)

(在此处找到答案:https://wordpress.stackexchange.com/questions/51776/how-to-load-wp-editor-through-ajax-jquery/192132


1) in functions.php ,添加:

add_action('init','my_wpEditOUPUTT'); function my_wpEditOUPUTT(){
    if (isset($_POST['Give_me_editorrr'])){
        wp_editor( '' , 'txtrID_'.$_POST['myNumber'], $settings = array( 'editor_class'=>'my_class',     'textarea_name'=>'named_'. $_POST['myNumber'],  'tinymce'=>true , 'media_buttons' => true , 'teeny' => false,));
        exit;   
    }
}

2)在仪表板HTML页面内:

<div id="MyPlace"></div> <a href="javascript:myLoad();">Click to load</a>

<script type="text/javascript">
startNumber = 1;
function myLoad(){ alert('wait 1 sec');
    startNumber ++;
    jQuery.post('./index.php', '&Give_me_editorrr=1&myNumber='+startNumber ,
        function(data,status){ 
            if (status == "success") {  
                document.getElementById('MyPlace').innerHTML += data; alert("Inserted!");   
                tinymce.init({ selector: 'txtrID_'+startNumber, theme:'modern',  skin:'lightgray'}); tinyMCE.execCommand('mceAddEditor', false, 'txtrID_'+startNumber);
            }
    });
}
</script>