为什么“GET_TEMPLATE_DIRECTORY_URI”指向子主题?

时间:2018-08-07 作者:Mr J Wolf

我有一个notmytheme, 最初的css加载顺序如下:

<link rel=\'stylesheet\' id=\'something\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme/something.css\' type=\'text/css\' media=\'all\' />
<link rel=\'stylesheet\' id=\'notmytheme-style-css\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme/style.css?ver=1.0.9\' type=\'text/css\' media=\'all\' />
当我创建一个名为notmytheme-child, 然后把孩子们排成一列,变成这样:

<link rel=\'stylesheet\' id=\'notmytheme-style-css\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme/style.css?ver=1.0.9\' type=\'text/css\' media=\'all\' />
<link rel=\'stylesheet\' id=\'child-style-css\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme-child/style.css?ver=18.08.07\' type=\'text/css\' media=\'all\' />
<link rel=\'stylesheet\' id=\'something\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme/something.css\' type=\'text/css\' media=\'all\' />
我希望父样式和子样式在其他样式之后加载,例如父主题的加载方式,因此我将其按优先级向下移动(add_action( \'wp_enqueue_scripts\', \'my_theme_enqueue_styles\', 999 ); ), 现在变成这样:

<link rel=\'stylesheet\' id=\'something\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme/something.css\' type=\'text/css\' media=\'all\' />
<link rel=\'stylesheet\' id=\'notmytheme-style-css\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme-child/style.css?ver=1.0.9\' type=\'text/css\' media=\'all\' />
<link rel=\'stylesheet\' id=\'child-style-css\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme-child/style.css?ver=18.08.07\' type=\'text/css\' media=\'all\' />
我不知道为什么,但现在get_template_directory_uri() 现在指向notmytheme-child 而不是notmytheme.

我当前的排队脚本如下所示:

add_action( \'wp_enqueue_scripts\', \'my_theme_enqueue_styles\', 999 );
function my_theme_enqueue_styles() {
    $parent_style = \'notmytheme-style\';

    wp_enqueue_style( $parent_style,
                        get_template_directory_uri() . \'/style.css\',
                        array(),
                        \'1.0.9\' );

    wp_enqueue_style( \'child-style\',
                        get_stylesheet_directory_uri() . \'/style.css\',
                        array( $parent_style ),
                        \'18.08.07\',
                        \'all\' );
}
调整优先级会更改css的加载位置以及哪个目录get_template_directory_uri() 指向。

EDIT/SOLUTION

我的代码现在是:

add_action( \'wp_enqueue_scripts\', \'my_enqueue_child\', 999 );
function my_enqueue_child() {   
    wp_dequeue_style( \'notmytheme-style\' );
    wp_enqueue_style( \'parent-style\',
                        get_template_directory_uri() . \'/style.css\',
                        array(),
                        \'1.0.9\' );

    wp_enqueue_style( \'child-style\',
                        get_stylesheet_directory_uri() . \'/style.css\',
                        array( \'parent-style\' ),
                        \'18.08.07\',
                        \'all\' );
}

3 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

主题通常会将样式表排成这样:

wp_enqueue_style( \'notmytheme-style\', get_stylesheet_uri() );
当你为一个主题激活一个子主题时,get_stylesheet_uri() 成为子主题的样式表URL。这意味着父主题将对子主题的样式表进行排队(使用notmytheme-style 作为ID),但不是它自己的样式表。

这就是它的来源:

<link rel=\'stylesheet\' id=\'notmytheme-style-css\'  href=\'http://localhost/mywp/wp-content/themes/notmytheme-child/style.css?ver=1.0.9\' type=\'text/css\' media=\'all\' />
它是父主题的ID和子主题的URL。

代码的问题是使用了相同的句柄(notmytheme-style) 要将父主题样式表作为父主题排队,请使用加载子主题的样式表。执行此操作时,它将被忽略,并将定义的第一个版本排入队列。这就是为什么更改优先级会影响结果。无论哪个notmytheme-style 先定义后加载。

因此,在这种情况下,让CSS排队的正确方法是不要让子主题样式表排队,而让父主题的样式表以不同的句柄和更高的优先级(更少的数字)排队:

add_action( \'wp_enqueue_scripts\', \'my_theme_enqueue_styles\', 9 );
function my_theme_enqueue_styles() {
    $parent_style = \'notmytheme-parent-style\'; // New handle.

    wp_enqueue_style( $parent_style,
                        get_template_directory_uri() . \'/style.css\',
                        array(),
                        \'1.0.9\' );
}
这意味着子主题样式表将使用父主题的版本号。可以通过取消父主题原始样式的队列并将其重新排队来避免这种情况:

add_action( \'wp_enqueue_scripts\', \'my_theme_enqueue_styles\', 999 );
function my_theme_enqueue_styles() {
    $parent_style = \'notmytheme-style\';

    wp_dequeue_style( $parent_style );
    wp_enqueue_style( $parent_style,
                        get_template_directory_uri() . \'/style.css\',
                        array(),
                        \'1.0.9\' );

    wp_enqueue_style( \'child-style\',
                        get_stylesheet_directory_uri() . \'/style.css\',
                        array( $parent_style ),
                        \'18.08.07\',
                        \'all\' );
}

SO网友:maverick

尝试按父主题的顺序排列样式(同时考虑依赖项)

确保您的子主题具有必要的文件(index.php、functions.php),并且上述代码位于函数内部。php文件。通常您的代码应该可以工作。

只是一些修改,看看这是否有效

add_action( \'wp_enqueue_scripts\', \'my_theme_enqueue_styles\' );
function my_theme_enqueue_styles() {
    $parent_style = \'notmytheme-style\';

    wp_enqueue_style( $parent_style,
                        get_template_directory_uri() . \'/style.css\' );

    wp_enqueue_style( \'child-style\',
                        get_stylesheet_directory_uri() . \'/style.css\',
                        array( $parent_style ) );
}
确保你的索引。php文件有必要的头

/*
 Theme Name:   Child Theme Name
 Theme URI:    
 Description:  
 Author:       
 Author URI:   
 Template:     notmytheme
 Version:      1.0.0
 License:      GNU General Public License v2 or later
 License URI:  http://www.gnu.org/licenses/gpl-2.0.html
*/

SO网友:Nilesh Sanura

当您必须将样式表从子主题排队时,请使用get\\u stylesheet\\u directory\\u uri()而不是get\\u template\\u directory\\u uri()。谢谢

结束

相关推荐

Child-theme breaks site

所以,我有一个子主题,里面除了所需的CSS文件之外什么都没有。一旦我激活了这个儿童主题,我的整个网站就关闭了。最后我有两个问题:激活一个只有CSS的子主题怎么能破坏我的网站</我怎样才能回到我原来的主题</这些是网站给我的错误:Warning: require_once(/wp-content/themes/interio_child/admin/options-framework.php) [function.require-once]: 无法打开流:中没有此类文件或目录/wp-c