我使用Wiz主题和我正在编写的插件。Wiz主题附带Visual Composer捆绑包和页面主题选项(页眉、侧边栏、页脚等)。但是,这些选项仅适用于页面,不适用于帖子。我的客户需要创建帖子,而不是页面,因为他使用的是我在插件中编写的自定义帖子类型。然后,我用Visual Composer创建了一个帖子,我的客户可以在新帖子中克隆和编辑该帖子,并创建了一个短代码[dw\\u evento],用于在页面中插入帖子的内容。短代码的PHP代码为:
public static function dw_evento()
{
global $wp_filter, $merged_filters, $wp_current_filter;
global $post;
$post_id = $_GET[\'post_id\'];
if (is_array($atts))
extract($atts, EXTR_OVERWRITE);
if (empty($post_id))
return;
$save_wp_filter = $wp_filter;
$save_merged_filters = $merged_filters;
$save_wp_current_filter = $wp_current_filter;
$post = get_post($post_id);
setup_postdata($post);
$content = $post->post_content;
$content = apply_filters(\'the_content\', $content);
//$content = do_shortcode($content);
$content = str_replace(\']]>\', \']]>\', $content);
$wp_filter = $save_wp_filter;
$merged_filters = $save_merged_filters;
$wp_current_filter = $save_wp_current_filter;
return $content;
}
然后,我创建了一个只包含该短代码的页面,以便为该页面设置主题选项(页眉、侧边栏、页脚)。最后,我的插件显示了post归档,并将列表中的每个项目链接到只包含短代码的页面,并在$\\u GET中传递post\\u id。
问题是,当使用永久链接直接浏览帖子时,以及使用我的快捷码浏览相应页面时,帖子内容的呈现方式不同。
更不用说内容了,因为这取决于帖子缺少的选项,在这里你可以看到帖子和页面内容的区别:
以下是其permalink浏览的帖子:http://www.miglioredirazzareport.eu/evento_type/internazionale-di-bari-2/
下面是页面中呈现的相同帖子,其短代码为[dw\\u evento]:http://www.miglioredirazzareport.eu/evento/?post_id=3753
正如您所看到的,页面呈现方式不同,尤其是缺少水平线。生成的HTML片段在两个文档中是相同的,例如,奖杯是:
<div class="uvc-heading-spacer line_with_icon" style="topheight:32px;">
<div class="ult-just-icon-wrapper ">
<div class="align-icon" style="text-align:center;">
<div class="aio-icon circle " style="color:#f67207;font-size:32px;display:inline-block;">
<i class="Defaults-trophy"></i>
</div>
</div>
</div>
</div>
然而,所应用的CSS规则略有不同。查看页面中应用了哪些CSS规则(在Chrome中检查),我在页面中缺少的帖子中看到了“::after”:
<div class="uvc-heading-spacer line_with_icon" style="topheight:32px;">
<div class="ult-just-icon-wrapper ">
<div class="align-icon" style="text-align:center;">
<div class="aio-icon circle " style="color:#f67207;font-size:32px;display:inline-block;">
<i class="Defaults-trophy"></i>
</div>
</div>
</div>
::after
</div>
并且“::after”将应用相关的CSS类,并显示水平线:
#ultimate-heading-447156b22ea4f2bf9 .uvc-heading-spacer.line_with_icon:before, #ultimate-heading-447156b22ea4f2bf9 .uvc-heading-spacer.line_with_icon:after {
width: 182px;
border-style: solid;
border-color: #ccc;
border-bottom-width: 1px;
}
现在问题来自于Wordpress生成页面时未包含的CSS文件。您可以从文档源中看到,页面的部分链接了除一个以外的所有CSS,即:
<link rel=\'stylesheet\' id=\'ultimate-style-min-css\' href=\'http://www.miglioredirazzareport.eu/wp-content/plugins/Ultimate_VC_Addons/assets/min-css/ultimate.min.css?ver=3.13.7\' type=\'text/css\' media=\'all\' />
这正是包含上面报告的“uvc heading spacer.line\\u with\\u icon:after”类的CSS文件。
现在我很确定我可以通过挂接“wp head”操作自己添加该文件,但这会使我的插件人为地依赖于最终的VC插件插件,而这与我无关。
为什么WordPress没有在我的页面中包含该样式表?
最合适的回答,由SO网友:Lucio Crusca 整理而成
我找到了一个“解决”问题的词语,但我不会接受这个答案,除非我不确定这是唯一的解决方案(我怀疑不是)。
我可以告诉你,WP没有包括最终的VC插件(从现在起为UVCA)CSS,因为我的页面不包含任何UVCA短代码,或者至少初始页面内容不包含任何UVCA短代码。WP中的短代码不是递归的。如果一个短代码生成的输出包含其他短代码,则程序员有责任处理这些短代码。我真的打过电话
$content = apply_filters(\'the_content\', $content);
但这还不足以包含所需的CSS,因为此时wp head操作已经运行。我猜在wp head操作中,无论是在wp代码中还是在UVCA代码中,都必须有如下代码片段:
foreach ($registered_shortcodes as $shortcode)
if (strpos($page_content, $shortcode) !== FALSE)
output_link_tags(get_dependencies($shortcode));
(注意,这几乎是伪代码,标识符是由组成的)。因此,强制一个UVCA短代码从一开始就出现在页面内容中,使得WP(或UVCA)包含所需的CSS,而不会使我的代码依赖于UVCA插件。
我通过使用我的[dw\\U elenco]短代码编辑我的页面并添加以下内容来“解决”这个问题:
<div style="display: none;">[ultimate_heading main_heading="x"][/ultimate_heading]</div>
这不是最好的解决方案,它肯定反映了一个bug。bug可能存在于我的代码(可能)、UVCA代码(也可能)或WP代码(不可能)。此外,该解决方案不是通用的。如果有一天,我的客户添加了其他需要自定义CSS的带有其他短代码的插件,那么这个解决方案将达不到要求。
然而,这是迄今为止我找到的最好的解决方案。
编辑:我现在可以接受我的答案,因为尽管不是唯一的解决方案,但这个问题没有干净的解决方案。在我的另一个更一般的问题中有更多细节here.