6

我已经按照 Nettuts 上的教程了解如何向 TinyMCE 添加自定义按钮(http://net.tutsplus.com/tutorials/wordpress/wordpress-shortcodes-the-right-way/

它工作得很好,但我想添加许多按钮,我想知道是否有一种聪明的方法可以做到这一点,而不必一遍又一遍地复制所有代码。

这是我用于添加按钮的代码:

add_shortcode("quote", "quote");  
function quote( $atts, $content = null ) {  
    return '<div class="right text">"'.$content.'"</div>';  
}

add_action('init', 'add_button');  
function add_button() {  
   if ( current_user_can('edit_posts') &&  current_user_can('edit_pages') )  
   {  
     add_filter('mce_external_plugins', 'add_plugin');  
     add_filter('mce_buttons_3', 'register_button');  
   }  
}  
function register_button($buttons) {  
   array_push($buttons, "quote");  
   return $buttons;  
}  
function add_plugin($plugin_array) {  
   $plugin_array['quote'] = get_bloginfo('template_url').'/js/customcodes.js';  
   return $plugin_array;  
}  

然后我使用以下代码创建一个 customcodes.js 文件:

(function() {  
    tinymce.create('tinymce.plugins.quote', {  
        init : function(ed, url) {  
            ed.addButton('quote', {  
                title : 'Add a Quote',  
                image : url+'/image.png',  
                onclick : function() {  
                     ed.selection.setContent('[quote]' + ed.selection.getContent() + '[/quote]');  

                }  
            });  
        },  
        createControl : function(n, cm) {  
            return null;  
        },  
    });  
    tinymce.PluginManager.add('quote', tinymce.plugins.quote);  
})();

再说一遍,我怎样才能添加多个按钮而不必为每个新按钮执行所有这些代码?

谢谢 :) 塞巴斯蒂安

4

4 回答 4

8

如果我正确理解您的问题,您想添加更多按钮而不必复制register_button($buttons)andadd_plugin($plugin_array)功能?

我知道这是一个老问题,但是有一种方法可以在不复制功能的情况下做到这一点。

只需进入您的 customcodes.js 并init : function(ed, url)像第一个一样在创建新按钮中,所以它看起来像这样:

init : function(ed, url) {  
             /* your original button */
            ed.addButton('quote', {  
            title : 'Add a Quote',  
            image : url+'/image.png',  
            onclick : function() {  
                 ed.selection.setContent('[quote]' + ed.selection.getContent() + '[/quote]'); 
            }  
        }); 
            /* your second button */
            ed.addButton('singlequote', {  
            title : 'Add a Single Quote',  
            image : url+'/image.png',  
            onclick : function() {  
                 ed.selection.setContent('[singlequote]' + ed.selection.getContent() + '[/singlequote]'); 
            }  
        }); 
} 

依此类推,您需要多少按钮。

之后,只需返回您的register_button($buttons)函数并更新array_push().

因此,当您只有一个按钮可以添加时,它看起来像这样:

function register_button($buttons) {  
array_push($buttons, "quote");  
return $buttons;  }

现在您已经创建了新按钮,此函数将如下所示。

function register_button($buttons) {  
array_push($buttons, "quote", "singlequote");  
return $buttons; }  

依此类推,取决于您添加了多少新按钮。

您无需复制功能,或添加新操作和过滤器即可将新按钮添加到您的 tinyMCE。

您只需在 tinyMCE 插件中创建新按钮并列出您在array_push().

也许您不知道array_push()接受多个推送值。 这是它在 php.net 上的文档

于 2012-05-10T03:44:27.347 回答
2

在第 3 步修改 php 以按下第二个按钮:

//Step 3: Register Our Button
function register_button($buttons) {  
   array_push($buttons, "BOUTON1");  
   array_push($buttons, "BOUTON2");  
   return $buttons;  
}

向该 BOUTON2 添加特定的传递:

//Step 4: Register Our TinyMCE Plugin
    function add_plugin($plugin_array) {  
       $plugin_array['BOUTON1'] = '/yourpathtojs/bouton1.js';  
       $plugin_array['BOUTON2'] = '/yourpathtojs/bouton2.js';  
       return $plugin_array;  
    } 

然后每个文件都有不同的文件,看看 PLUG1 和 BOUTON1 的使用,在 nettuts 上更好,因为它们不区分“报价”一词:

布顿1.js:

(function() {  
    tinymce.create('tinymce.plugins.PLUG1', {  
        init : function(ed, url) {  
            ed.addButton('BOUTON1', {  
                title : 'You', image : url+'/image.png',  
                onclick : function() { ed.selection.setContent('[thumb from="youtube" code="'+ed.selection.getContent()+'"]'); }  
            });  
        },  
        createControl : function(n, cm) {  
            return null;  
        },  
    });  
    tinymce.PluginManager.add('BOUTON1', tinymce.plugins.PLUG1);  
})();

布顿2.js:

(function() {  
        tinymce.create('tinymce.plugins.PLUG2', {  
            init : function(ed, url) {  
                ed.addButton('BOUTON2', {  
                    title : 'Vim', image : url+'/image.png',  
                    onclick : function() { ed.selection.setContent('[thumb from="vimeo" code="'+ed.selection.getContent()+'"]'); }  
                });  
            },  
            createControl : function(n, cm) {  
                return null;  
            },  
        });  
        tinymce.PluginManager.add('BOUTON2', tinymce.plugins.PLUG2);  
    })();
于 2012-04-07T11:04:47.133 回答
1

除了可能在您已经存在的功能中添加额外的按钮代码之外,我认为没有办法做您正在尝试的事情。

不幸的是,这是添加按钮的代码,所以如果你想添加另一个按钮,你必须再次添加代码。

如果您要添加的按钮几乎在所有方面都相似,那么您可以通过 aforeach {}后跟 a 来switch(){case '':}提供数据,但除非您的所有按钮都执行相同的操作,否则这似乎有点多余。

如果您要做的只是保持您的 function.php 文件整洁,那么我建议将每个按钮放在一个单独的 .php 文件中,该文件与主函数名称相同,在一个名为 inc 的文件夹中或包含在您的模板中,然后包含它们像这样:

$temp_path = 'http//www.yourdomain.com/wp-content/theme/yourtheme/includes/';


include $temp_path.'file1.php';
include $temp_path.'file2.php';

我正在使用 temp_path 变量,因为出于某种原因bloginfo()get_bloginfo()它似乎在函数文件中不起作用。

附带说明一下,即使它只是供个人使用,也请尝试使用更多独特的函数名称,quote可以是任何东西,tinymce_quote_button这绝对是它的样子。这避免了以后潜在的函数名称冲突。

于 2011-04-04T01:25:47.277 回答
0

如果所有按钮都是相关的并且您想一次添加它们(即您不需要选择添加哪些按钮,您可以在 init 调用中复制 ed.addButton 调用。这将是有意义的将每个 addbutton 调用封装到它自己的函数中,

(function() {  
    function addQuoteButton(ed, url){
        ed.addButton('quote', {  
            title : 'Add a Quote',  
            image : url+'/image.png',  
            onclick : function() {  
                 ed.selection.setContent('[quote]' + ed.selection.getContent() + '[/quote]');  
            }  
        });  
    }
    function addOtherButton(ed, url){
        // functionality to add another button.
    }
    tinymce.create('tinymce.plugins.quote', {  
        init : function(ed, url) {
            addQuoteButton(ed, url);
            addOtherButton(ed,url);  
        },  
        createControl : function(n, cm) {  
            return null;  
        },  
    });  
    tinymce.PluginManager.add('quote', tinymce.plugins.quote);  
})();

为了进一步分解,您可以将 add*Button 函数拆分为它们自己的文件(如@DouglasMarken 所建议的那样)。

于 2011-04-04T21:51:20.117 回答