Wordpress:是否可以在块编辑器样式表中使用 post-type 作为 css 选择器的一部分?

Wordpress: Is it possible to use post-type as part of a css selector in block editor stylesheet?

我创建了一个 Wordpress 主题,现在我正在为块编辑器制作一个编辑器样式表,以更好地反映编辑器中的主题外观。为此,我需要能够解决其中的不同 post 类型。

对于前端,有一个要在模板中使用的 body_class() 函数,它插入 - 其中 - 一个 class 标识 post 类型并且可以使用在组合选择器中仅在特定 post 类型中处理某些元素。

现在,post-type class 在页面的正文标签中,也在编辑模式下,但显然是编辑器样式表CSS 以一种 "isolated" 的方式应用 – 包含正文标签中的 classes 的组合选择器在编辑器中不起作用。

所以我正在寻找可以在块编辑器中使用的类似东西,这样我就可以在仅适用于特定 post 类型的某些元素的组合选择器中使用它。

知道怎么做吗?


顺便说一句,我还尝试使用 Javascript/jQuery:

检查 post 类型
wp.domReady(function() {
        var postType = jQuery('form.metabox-base-form input#post_type').attr('value');
        if(postType == 'post'){
            alert("It's a post!");//in real life some other action...
        }
});

但是尽管至少触发我放入其中的警报是合乎逻辑的,但是当我加载 post 的编辑页面时没有任何反应,其中包含其 "post" 值的输入元素显然存在。 (?)


补充:尝试一切我能想到的解决方案,我还尝试了这个脚本,看看我是否可以在使用编辑器时检查正文 classes:

jQuery(document).ready(function() {
    if(jQuery('body').hasClass('post-type-page')) {
        alert("It's a page!");
    } else {
        alert("It's not a page");
    }
});

编辑器页面上的结果(即显示 WP 块编辑器的网页):完全没有警报!为什么???块编辑器 Javascript block/prevent 所有其他 Javascript?


P.S.: 我之前在 StackExchange WordPress 开发上 post 编辑了这个问题的第一部分,但没有任何反应,所以我在这里尝试...

我自己找到了解决方案(但@JobiWon9178 提供了提示 - 谢谢!!!)。不纯粹CSS,但涉及一些JS/jQuery。这是一个类似于我已经在问题中 post 编辑的脚本,添加了必要的添加以动态添加 classes 到相关的 HTML 元素:

$(document).ready(function() {
    if($('body').hasClass('post-type-page')) {
        $('#editor').addClass('post-type-page');
    } else if($('body').hasClass('post-type-post')) {
        $('#editor').addClass('post-type-post');
    }
});

这会将相关的 post-type-xxxx class 添加到 #editor DIV,这是块编辑器的外部容器之一。与 body classes 相反,此元素 的 classes 与编辑器内容相关,可以在组合选择器中使用编辑器样式表。

(注意:最初我尝试将 class 添加到具有 classes edit-post-visual-editor editor-styles-wrapper 的包装器 DIV 中,但这行不通 - post-type class 根本没有被添加。)

示例:编辑器样式表中的以下 CSS 规则现在将应用于编辑器中的所有段落块,但仅当 post 类型为页面时:

.post-type-page .wp-block-paragraph {
   /* (CSS settings here) */
}

一个重要的细节,@JobiWon9178 在评论中指出:上面的 jQuery 脚本必须使用 admin_enqueue_scripts 添加,而不是与前端脚本一起添加。所以我将该脚本放入一个名为 admin_scripts.js 的文件中,并将其放入 functions.php:

中,如下所示
function my_admin_scripts($hook) {
    if ( 'post.php' != $hook ) {
        return;
    }
    wp_register_script('adminscripts', get_template_directory_uri() . '/js/admin_scripts.js', '', null, true);
    wp_enqueue_script('adminscripts');
}
add_action( 'admin_enqueue_scripts', 'my_admin_scripts' );

这就是我的工作解决方案。如果有人仍然想出一个纯粹的 CSS 解决方案,我会很高兴,但我想现在(即在 Wordpress 5.3 中)没有 CSS-only 方法。

我完全可以做到这一点 CSS。您确定您的 CSS 已正确添加吗?

add_action('admin_head', 'my_custom_fonts');
function my_custom_fonts() {
      echo '<style>
              .post-type-page .wp-block-paragraph {
                   font-size: 5rem;
               }
      </style>';
 }

如果我进入编辑器,这一段文本只在一个页面下被修改。

这是 运行 WP 5.3.2。

add_editor_style 在技术上用于自定义 TinyMCE。

在 WP 5.0 中添加了使用 enqueue_block_editor_assets 来为块添加样式和功能。

https://developer.wordpress.org/reference/hooks/enqueue_block_editor_assets/

编辑: CSS只有版本

function custom_block_editor_styles() {
    wp_enqueue_style( 'legit-editor-styles', get_theme_file_uri( '/css/style-editor.css' ), false, '1.0', 'all' );
}
add_action( 'enqueue_block_editor_assets', 'custom_block_editor_styles' );