我认为您可以通过在输出标题之前应用内容过滤器来预先运行页面上的短代码来解决这个问题。这应该允许在包含的帖子中运行任何内部短代码,以正确添加任何操作挂钩,从而添加任何所需的样式表/资源。
add_action(\'wp_loaded\',\'maybe_prerun_shortcodes\');
function maybe_prerun_shortcodes() {
if (is_page()) {
global $post;
if (has_shortcode($post->post_content,\'embed_post\')) {
$content = apply_filters(\'the_content\',$post->post_content);
}
}
}
EDIT 上述操作只会将在嵌入式post中的任何短代码调用中排队的样式表和资源排队(虽然这是更好的做法,但实际上并不经常这样做)它应该适用于这些情况,因为将过滤器应用于当前页面内容将运行嵌入的短代码,然后将过滤器应用于嵌入的帖子(在您现有的函数中)
然而,要获取特定帖子的样式表,您必须获取该特定帖子(这就是为什么iframe方法可以工作的原因,考虑到已经讨论过的问题)
在这种情况下,我建议的解决方法是在加载帖子时存储帖子上加载的样式资源。。。
add_filter(\'style_loader_tag\',\'custom_store_style_tags\',11,2)
function custom_store_style_tags($tag,$handle) {
global $styletags; $styletags[$handle] = $tag;}
}
add_action(\'wp_footer\',\'custom_save_style_tags\');
function custom_save_style_tags() {
global $embedstyles;
if (is_single()) {
global $styletags, $post;
update_post_meta($post->ID,\'styletags\',$styletags);
} elseif (is_array($embedstyles)) {
global $styletags;
foreach ($embedstyles as $handle => $tag) {
if (!array_key_exists($handle,$styletags)) {echo $tag;}
}
}
}
然后,您可以使用快捷码检索要检索的样式标记,上述函数的第二部分将在页脚中输出它们:
public static function myshortcode($atts = null, $content = "")
{
// EXISTING CODE SNIPPED
global $embedstyles;
$embedstyle = get_post_meta($post_id,\'styletags\',true);
if (is_array($embedstyle)) {
if (!is_array($embedstyles)) {$embedstyles = array();}
$embedstyles = array_merge($embedstyle,$embedstyles);
}
return $content;
}
您也可以通过
script_loader_tag
过滤并简单地更改变量以匹配。。。
当然,仍然有一些可能性body
类可能不是@cjbj所提到的样式的目标。。。或者,一些脚本可能会在页脚中初始化,即使它们已正确排队。
。。。而且它还没有考虑到页面上打印(未排队)的内联样式/脚本。。。但这是一个好的开始。。。取决于你想走多远。