如何在每个父样式表/语句之后*之后,将子样式表排入队列?


11

我将Chip Bennett精心编写的Oenology主题用作我自己的Child主题的父主题。

在我的开发过程中,我发现在编写有关控制样式的儿童主题方面,人们面临一些挑战。

我刚刚发现我的主要style.css文件先于<head>中的所有其他样式表链接或语句加载,这解释了为什么我无法覆盖某些Parent样式。

对问题的进一步研究表明,可以将<parent>的各种Parent样式表和样式放在三个位置的队列中;add_action('wp_print_styles',add_action('wp_enqueue_scripts',然后add_action('wp_head',

为了简单起见,我计划创建两个样式表。第一个主“ style.css”工作表将仅包含@import url()加载Oenology主样式表所需的命令。

第二个样式表将包含我的子规则。为了确保在所有其他规则之后将其加载,我将使用对其进行排队add_action( 'wp_head',

听起来合理吗?还是有更好(更正确)的方法?

顺便说一句,有没有人知道发生了什么/parent-theme/style.css ?MRPreviewRefresh = 723 '的意思?

更新资料

wp_enqueue_style()在wp_head()中似乎不起作用。

干杯,
格雷戈里

Answers:


21

仅供参考,这个问题可能与太过局限性有关,因为它是特定于酿酒学主题的。

就是说,这是我认为您遇到问题的地方:Oenology包含两个样式表:

  1. style.css,直接在文件头部(因此之前 wp_head()被激发)
  2. {varietal}.csswp_enqueue_scripts优先11functions/dynamic-css.php

    /**
     * Enqueue Varietal Stylesheet
     */
    function oenology_enqueue_varietal_style() {
    
    // define varietal stylesheet
    global $oenology_options;
    $oenology_options = oenology_get_options();
    $varietal_handle = 'oenology_' . $oenology_options['varietal'] . '_stylesheet';
    $varietal_stylesheet = get_template_directory_uri() . '/varietals/' . $oenology_options['varietal'] . '.css';
    
    wp_enqueue_style( $varietal_handle, $varietal_stylesheet );
    }
    // Enqueue Varietal Stylesheet at wp_print_styles
    add_action('wp_enqueue_scripts', 'oenology_enqueue_varietal_style', 11 );

该品种样式,它适用于“皮肤”,入队以优先级11,以确保基本样式表,style.css,加载第一和品种样式表加载第二,为了使正确的级联。

因此,如果您需要覆盖品种样式表,只需将第二个样式表排入品种样式表之后即可;即具有至少12或更高的优先级。

编辑

为了提供更一般的问题的答案:

为了覆盖父主题样式表入队,您需要了解两件事:

  1. 样式表所在的动作挂钩
  2. 回调添加到挂钩的优先级

入队功能(wp_enqueue_script()/ wp_enqueue_style())可以在挂钩和/ 挂钩之间的任何位置正确执行。(当前在其上执行功能的语义正确的钩子。)此列表包括以下操作(除其他外;这些只是通常的可疑对象):initwp_print_scriptswp_print_styleswp_enqueue_*()wp_enqueue_scripts

  • init
  • wp_head
  • wp_enqueue_scripts
  • wp_print_scripts/wp_print_styles

(需要注意的是wp_enqueue_scriptswp_print_styleswp_print_scripts 所有消防里面wp_head,在特定的优先级

因此,为了覆盖父主题样式表,您需要执行以下操作之一:

  • 通过取消将父主题样式表入队wp_dequeue_style( $handle )
  • 删除通过样式加入队列的父主题回调remove_action( $hook, $callback )
  • 通过将您的Child-Theme样式表wp_enqueue_style()调用挂接到优先级较低同一个钩子后面的钩子中使用CSS级联覆盖父主题样式表。

    对于最后一个选项,如果父主题使用:

    `add_action( 'wp_enqueue_scripts', 'parent_theme_enqueue_style', $priority )`

    ...然后,儿童主题将使用:

    `add_action( 'wp_enqueue_scripts', 'child_theme_enqueue_style', {$priority + 1} )`

谢谢芯片。我确实可以使用wp_enqueue_scripts和高序号来使我的Child样式表最后加载。但是,在我的Child样式表语句之后,仍然有3种不同的样式语句。其中2个由WP本身输出!!,1个由Oenology通过wp的add_custom_image_header()函数输出。
格雷戈里

body.custom-background样式声明由WP本身输出,但是看来我可以通过定义'BACKGROUND_COLOR'指定自定义背景色。奇怪的是,需要通过自定义WP常量设置基本的CSS规则。
格雷戈里

1
最后评论芯片。这个问题是不是太本地化。许多主题将使用所有可用的钩子来排队或打印样式,Child主题开发人员需要知道如何覆盖这些样式而不必禁用它们。干杯。
格雷戈里

我看到的问题是child_theme_enqueue_style将以更高的优先级加载子样式,在wp_head下方,它将复制子样式表-Wordpress将自动以其正常优先级加载子样式表,然后再次加载,以新的优先级进一步下降。在获得覆盖所有其他样式表的结果的同时,它在页面中创建了重复的样式表。
php-b-grader

2

确保我的样式在级联中拥有最终决定权的唯一方法是通过wp_head钩子将它们包括在<head>的末尾。wp_enqueue在wp_head中不起作用,因此我不得不直接回显链接:

function gregory_enqueue_stylesheets() {
    $base = get_stylesheet_directory_uri();
    echo '<link rel="stylesheet" href="'.$base.'/style-gregory.css" type="text/css" media="all">';
    return;
}
add_action( 'wp_head', 'gregory_enqueue_stylesheets', 18 );

最后,我可以相对轻松地设置样式,而无需使用高水平的特异性,也可以使用!important规则,该规则只能作为最后的选择。

WP需要更好的样式排队系统。每种样式,无论是文件链接样式还是内联样式,都应通过同一钩子传递,以允许Priority确定其顺序。(可选)出于调试目的,如果挂钩还以注释形式输出每种样式的优先级值,则将很有用。

更新资料

通过将样式表分为两部分,我可以保留子主题中样式的控制权,同时保持父主题的原始级联(使用主样式表,子样式表和一些样式声明)。问题。我不再使用wp_head()钩子,而是使用具有高序数的正确和标准的wp_enqueue_scripts()钩子来确保最后加载我的样式表。

我的孩子主题的默认样式表:

/*
Theme Name: Oenology-Gregory
Template: oenology
Version: 20120506-0026
*/

@import url("/wp-content/themes/oenology/style.css");

排队我的主要样式表的功能:

function gregory_enqueue_stylesheets() {
    $base = get_stylesheet_directory_uri();
    wp_enqueue_style( 'style-gregory', $base.'/style-gregory.css' );
    return;
}
add_action( 'wp_enqueue_scripts', 'gregory_enqueue_stylesheets', 18 );

但是,样式表之后有一些由WP生成的样式声明(即,不是父主题),我将不得不考虑使用高特异性的CSS规则来覆盖与我相关的规则,或者寻找挂钩以禁用它们,尤其是body.custom-background规则。

谢谢大家的意见。

干杯,
格雷戈里


1

您应该始终使用它wp_enqueue_style()来加载样式表,并且应该将函数挂钩到wp_enqueue_scripts挂钩中,并在头部运行。我怀疑您没有将它挂在那里,因此您遇到了问题。(从WP 3.3开始,如果wp_enqueue_style()与其他任何东西挂钩,则在WP_Debug处于打开状态时会引发通知)。


@Chip的答案比我的要好,并且可以说他更有资格讨论Oenology主题;)是否是在这种情况下我应该删除答案,即使它是正确的?
mrwweb 2012年

不,我会留下你的答案。这是正确的,并且解决了问题的特定部分。
Chip Bennett
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.