当页面/帖子加载时,如果特定的 CSS 类名存在于该帖子/页面的 HTML 中,我想执行 PHP 代码,对性能影响最小(页面显示)。如果该类存在,代码将调用链接的资源将添加到 html head 中。
代码放在添加到function.php中的代码片段中
为了检查 html 中是否存在 css 类,我尝试了几种方法,但从未成功(
has_term()
从未找到,等等)。
我可能找到了解决方案的一部分,但如何获取 html
$result = $html->find('.classname');
那么,如何检查正在加载的页面/帖子的 html 代码中是否存在 css 类?
我可以想到两种方法来实现这一目标。
首先,如果您在网站的头部确实不需要它,您可以直接连接到主内容过滤器并使用 6.2 中引入的 WP_HTML_Tag_Processor 类。
这样做的优点是它是页面本机生命周期的一部分,并且不应该产生任何意外的副作用。这样做的缺点是,当它运行时,您可能位于网站的
<body>
中,因此您无法影响 <head>
。
add_filter(
'the_content',
static function ($content) {
$processor = new WP_HTML_Tag_Processor($content);
if ($processor->next_tag(['class_name' => 'your-class-here'])) {
// Do something here, however you should be aware that wp_head might have already been called
}
return $content;
}
);
第二种方法是抓取当前对象并检查 HTML。
这样做的好处是它将运行得足够早,以便您可以将一些内容输出到站点的
<head>
中。这样做的缺点是,正如所写的那样,您没有应用内容过滤器。如果您的内容直接来自数据库,这可能不是问题。如果您有其他插件添加这些类,此时可能不会添加它们。但是,您可以尝试调用apply_filters('the_content', $post->post_content)
,但是我已经看到这会在某些网站上引起问题,因为其他开发人员可能不希望每个页面会多次调用它。
add_action(
'wp_enqueue_scripts',
static function () {
$post = get_queried_object();
if ($post instanceof WP_Post) {
$processor = new WP_HTML_Tag_Processor($post->post_content);
if ($processor->next_tag(['class_name' => 'video-responsive-container'])) {
// Do something here
}
}
}
);