如何向TinyMCE添加自定义CSS(主题选项)?

时间:2013-10-31 作者:Justin Tadlock

我正在尝试向WordPress中的TinyMCE可视化编辑器添加自定义CSS(通过主题选项设置)。在前端,主题生成此CSS并将其输出到wp_head 钩我遇到的问题是如何将CSS输出添加到编辑器中。

这不能用add_editor_style( \'editor-style.css\' ) 因为我们需要使用PHP来访问主题选项。

作为其在前端工作原理的示例:

add_action( \'wp_head\', \'my_custom_colors\' );

function my_custom_colors() {
    $color_1 = get_theme_mod( \'color_1\', \'cc4a00\' );

    echo "<style type=\'text/css\'>a { color: #{$color_1}; }";
}
我需要一种方法将该自定义样式输入到可视化编辑器中。任何帮助都将不胜感激。

5 个回复
最合适的回答,由SO网友:ungestaltbar 整理而成

解决方案1作为javascript解决方案:

示例:

tinyMCE.activeEditor.dom.addStyle(\'p {color:red; font-size:28px;}\');
只需打开js控制台并粘贴它即可进行快速测试。要以特定编辑器为目标,应使用:

tinyMCE.getInstanceById(\'##editorID##\').dom.addStyle(\'p {color:red; font-size:28px;}\');
这将把提供的字符串注入到编辑器iframe中<head><style id="mceDefaultStyles"></style> ...

解决方案2使用wp\\u ajax作为回调处理程序,通过使用过滤器在编辑器init上添加动态样式

add_filter(\'tiny_mce_before_init\', \'dynamic_editor_styles\', 10);

function dynamic_editor_styles($settings){
    // you could use a custom php file as well, I\'m using wp_ajax as
    // callback handler for demonstration
    // content_css is a string with several files seperated by a comma
    // e.g. file1, file2, ... extend the string

    $settings[\'content_css\'] .= ",".admin_url(\'admin-ajax.php\') ."/?action=dynamic_styles";
    
    return $settings;
}

// add wp_ajax callback
add_action(\'wp_ajax_dynamic_styles\', \'dynamic_styles_callback\');
function dynamic_styles_callback(){
    echo "p {color:red} h1{font-size:48px;}";
}

SO网友:Chip Bennett

WordPressprovides a mce_css filter, 可用于将自定义样式表添加到可视化编辑器。根据法典:

文件可以是。php文件,允许动态生成内容编辑器的CSS规则。

Codex筛选器回调示例,针对主题进行了修改:

function wpse120831_mce_css( $mce_css ) {
    if ( ! empty( $mce_css ) )
        $mce_css .= \',\';

    $mce_css .= get_template_directory_uri() . \'/dynamic-css.php\';

    return $mce_css;
}

add_filter( \'mce_css\', \'wpse120831_mce_css\' );

SO网友:Justin Tadlock

我通过@ungestaltbar接受了上述解决方案。然而,我想用我正在使用的完整解决方案来扩展这个答案,以便其他人可以看到它是如何工作的。

add_action( \'after_setup_theme\', \'my_theme_setup\' );

function my_theme_setup() {

    add_editor_style(
        array(
            \'editor-style.css\',
            add_query_arg( \'action\', \'my_editor_styles\', admin_url( \'admin-ajax.php\' ) ),
        )
    );
}

add_action( \'wp_ajax_my_editor_styles\', \'my_editor_styles_callback\' );
add_action( \'wp_ajax_nopriv_my_editor_styles\', \'my_editor_styles_callback\' );

function my_editor_styles_callback() {

    // @todo sanitize
    $color_1 = get_theme_mod( \'color_1\', \'cc4a00\' );

    echo "a { color: #{$color_1}; }";

    die();
}
我希望可以像这样在这里发布另一个答案。我没有找到一种直接回复我接受的解决方案的方法。我还在学习如何使用WPSE。

SO网友:Ayebare M

我可能来晚了,但在使用上述解决方案后,我很快意识到编辑器的页面加载速度严重受损!仔细看了一下代码,我意识到在tinyMCE之后,代码一直在执行。activeEditor已初始化。代码使用setInterval()方法,该方法以指定的时间间隔计算表达式,我认为这是因为您无法确定在代码执行期间的什么时候“activeEditor”可用。这就是页面速度下降到最低的原因。

我用来构建插件的一个更好的解决方案是

   /**
     * Extend TinyMCE config with a setup function.
     * See http://www.tinymce.com/wiki.php/API3:event.tinymce.Editor.onInit

     */
    function custom_tinymce_css($init) {

      $css = get_option(\'some_css\'); 

     ?>

        <script type="text/javascript">            

            function addTempCSS( ed ) {
                ed.onInit.add( function() {
                    tinyMCE.activeEditor.dom.addStyle(<?php echo json_encode($css) ?>);
                } );
            };
        </script>

        <?php
        if (wp_default_editor() == \'tinymce\')
            $init[\'setup\'] = \'addTempCSS\';

        return $init;
    }
    add_filter(\'tiny_mce_before_init\', \'custom_tinymce_css\');
这里,本地TinyMCE侦听器用于在激活编辑器初始化后执行代码。我希望这能帮助其他人。谨致问候。

SO网友:Justin Tadlock

这是WordPress上发布的一个经过修改的解决方案。此问题的组织论坛:http://wordpress.org/support/topic/customdynamic-css-in-tinymce?replies=14#post-4827573

这绝对有效。我不是JS大师,所以我不完全确定这是否是最好的解决方案。

add_action( \'before_wp_tiny_mce\', \'my_tinymce_callback\' );

function my_tinymce_callback() {

    $color_1 = get_theme_mod( \'color_1\', \'cc4a00\' ); ?>

    <script type="text/javascript">
    jQuery( document ).ready(

        function() {
            var my_style = \'a { color: #<?php echo $color_1; ?>; }\';

            var checkInterval = setInterval(
                function() {

                    if ( \'undefined\' !== typeof( tinyMCE ) ) {
                        if ( tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden() ) {

                            jQuery( \'#content_ifr\' ).contents().find( \'head\' ).append( \'<style type="text/css">\' + my_style + \'</style>\' );

                            clearInterval( checkInterval );
                        }
                    }
                }, 
                500 
            );
        }
    );
    </script>
<?php }
这也可以添加到JS文件中。您可以通过wp_localize_script() 用这个。

结束

相关推荐

TinyMCE格式下拉菜单不再显示样式预览

在过去,通过添加编辑器样式表,我能够在格式和样式下拉列表中看到选项,就像它们出现在帖子中一样。也就是说,菜单中的条目将根据放置在编辑器样式表中的CSS规则设置样式。奇怪的是,这在两个都已更新为WP 3.6的站点上停止了工作。我仍然可以在编辑器内容窗口中看到自定义样式,并且这些样式仍然应用于帖子内容-它们只是不作为样式选项显示在下拉菜单中。更奇怪的是,我定义的一个自定义规则确实会显示在下拉列表中,并应用其自定义样式。编辑器样式表实际上是通过以下内容添加的整个前端样式表,并且显然是有效的,因为样式在帖子内容中