如何根据页面名称有条件地推迟脚本?

时间:2018-05-09 作者:A Jar of Clay

我在函数中有以下代码。php。第一个函数根据页面名称正确地将脚本排队。但是,第二个函数总是添加“defer”属性。

function custom_scripts() {
    global $page;
    if ($page->page_name !== \'awkward_page\') {
        wp_enqueue_script(\'jquery\');
    }

    // ...
}
add_action( \'wp_enqueue_scripts\', \'custom_scripts\' );


function defer_scripts( $tag, $handle ) {
    global $page;
    if ($page->page_name !== \'awkward_page\') {
        return str_replace( \' src\', \' defer src\', $tag );
    }
    return $tag;
}
add_filter( \'script_loader_tag\', \'defer_scripts\', 10, 2 );
此代码有什么问题?

如果这是有条件地添加“defer”html属性的错误方法,那么正确的方法是什么?

1 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

全球$page 变量不是WP_Post 对象这只是帖子ID。所以要获取页面标题,您需要获取WP_Post 对象首先从post ID开始。

延迟总是被添加的原因有两个。第一$page 是整数,所以$page->page_name 将评估为nullnull 与“笨拙的页面”不同。它还会引发错误或警告。而且page_name 不是WP\\U Post对象的有效属性。正确的属性为post_name - 甚至在页面上。

function defer_scripts( $tag, $handle ) {

    //* Get the post object
    $page = get_post( get_the_ID() );

    //* Defer on some condition
    if( \'awkward_page\' !== $page->post_name ) {
      $tag = str_replace( \' src\', \' defer src\', $tag );
    }
    return $tag;
}
add_filter( \'script_loader_tag\', \'defer_scripts\', 10, 2 );

结束

相关推荐