Mystery line break

时间:2020-01-17 作者:MatJon

如果有人不介意用哑炮的话,我有一个关于编码的问题。尝试将标题与标签放在同一行上,即

标签:标题

当前格式为:

标签:

标题

<p>
<?php echo apply_filters(\'cm_tooltip_parse\', \'Label: \', true); ?>
<?php if ( generate_show_title() ) {
    the_title();
}
?>
</p>
还尝试了:

<p>
<?php echo apply_filters(\'cm_tooltip_parse\', \'Label: \', true);
if ( generate_show_title() ) {
    the_title();
}
?>
</p>
通常我对基本格式没问题,但有关过滤器的某些内容必须强制中断,

谢谢

嗨,蒂姆,我已经在下面加入了完整的代码,看看它是如何影响这一点的。

使用Tim的代码“Label”和“Title”现在位于同一行,但(正如他所指出的)尽管进行了修剪,我在该行下方仍有一个空格(“Published on”开始了一个新段落)。如果我删除<p> 之前\'Label: \',\'</p>\', 在它后面放一个<br /> 最后,我得到了所需的格式,但工具提示不再适用于\'Label: \'

<p>
<?php 
echo ! generate_show_title() ?: trim( apply_filters( \'cm_tooltip_parse\', the_title( \'Label: \', false ), true ), " \\t\\n\\r\\0\\x0B" );
?><br />                            

Published On: <time datetime="<?php echo esc_attr( get_the_date( \'c\' ) ); ?>"><?php echo esc_html( get_the_date() );
                            ?></time><br />

<?php if( get_field(\'date_updated\') ): ?>
    Updated On: <?php the_field(\'date_updated\'); ?><br />
<?php endif; ?>

</p>

2 个回复
SO网友:majick

您可以试试看是否有任何不同:

<p>
<?php $label = apply_filters(\'cm_tooltip_parse\', \'Label: \', true);
if ( generate_show_title() ) {$title = get_the_title();} else {$title = \'\';}
echo str_replace( array( "\\n", "\\r"), array( \'\', \'\'), $label . $title );
?>
</p>
如果可行的话,cm_tooltip_parsegenerate_show_title 可能正在某处输出换行符,但至少它是以这种方式删除的。

SO网友:Tim Elsass

确实没有提供足够的信息,但从您提供的代码中,我看到:

所使用的过滤器属于插件,用于需要为添加到词汇表中的任何匹配术语解析和格式化动态内容的位置,可以选择为术语添加工具提示。您正在传递一个静态字符串"Label: " 对此CM Tooltip Glossary > Tooltip - Content > Clean tooltip text? 和CM Tooltip Glossary > Tooltip - Content > Avoid parsing protected tags?. 您是否尝试过切换它们以查看它们是否提供您想要的输出the_title 在您的apply_filters 呼叫您很可能希望解析器不仅仅检查静态字符串\'Label: \' 也意味着在解析中包含标题:

<?php echo ! generate_show_title() ?: apply_filters( \'cm_tooltip_parse\', the_title( \'<p>Label: \', \'</p>\', false ), true ); ?>
<因为示例代码是在静态字符串之后添加换行符\'Label: \', 那就意味着使用上述代码输出将在一行中,如您所愿:<p>Label: $title</p>. 解析器中的换行符仍然存在,并在此之后输出。您可以将输出包装为trim() 我猜:
<?php 
/**
 * Trims the following from output string:
 * 
 * \' \'   : Whitespace
 * \'\\t\'  : tab
 * \'\\n\'  : newline
 * \'\\r\'  : carriage return
 * \'\\0\'  : NUL-byte
 * \'\\x0B\': vertical tab
 */
echo ! generate_show_title() ?: trim( apply_filters( \'cm_tooltip_parse\', the_title( \'<p>Label: \', \'</p>\', false ), true ), " \\t\\n\\r\\0\\x0B" );
<人力资源>Edit:我从提供的代码片段中看到的其余问题看起来可能是由无效的HTML引起的

以这个基本示例为例:

<p>
    <p>something</p>
</p>
第一个<p> 当打开标记遇到下一个时,它将在浏览器中自动关闭<p> 围绕“某物”的开始标记。因此,在这个基本示例中,浏览器最终会呈现如下内容:

<p>
</p>
<p>something</p>
<p>
</p>
我想尝试的是改变你周围的环境<p> 标记为<div> 首先,您的标签/标题通常应该是某种标题标签。我不知道整页的标记,所以我很难说,但我还是同意<h1>. 这个<h1> 元素应该包含页面的主要“主题”,因为这是人们通常填写的内容the_title - 使用它可能是正确的:

<div class="page-details-with-tooltip">
    <?php echo ! generate_show_title() ?: trim( apply_filters( \'cm_tooltip_parse\', the_title( \'<h1>Label: \', \'</h1>\', false ), true ), " \\t\\n\\r\\0\\x0B" ); ?>
    <p>
        Published On: <time datetime="<?php echo esc_attr( get_the_date( \'c\' ) ); ?>"><?php echo esc_html( get_the_date() ); ?></time></br>
        <?php if ( get_field(\'date_updated\') ) : ?>
        Updated On: <?php the_field(\'date_updated\'); ?>
        <?php endif; ?>
    </p>
</div>
这里我们使用<div> 表示可能包含其他块的内容块。在本例中,标题有一个heading元素(<h1>) 段落内容是用元信息进一步描述主题细节的随附文本,我们将其包装在<p> 标签标题元素(h1-h6)称为heading content, 我想这名字很贴切。

所以你可能想知道为什么<time> 元素在输出中没有断开到新行,即使在检查时看到它显示在新行上。那是因为这是phrasing content, 它基本上定义了标记内部的文本及其可能包含的任何标记。这个<br> 是一个换行符,表示段落从下一行的开头开始,有点像回车(如\\r 我们在上面脱衣)。仅当段落中的内容在视觉上很重要时,才应使用此选项,而不是用于段落之间的间距。一般来说,我尽量避免<br>\'在任何标记中都是,但对于这种情况,我们的输出只是文本,在这里使用换行符是正确的。这个<br> 在您在Updated On: $date 零件在这里使用不正确。我假设这是因为你有内容可以跟随它而使用的,并且希望下面有足够的空间来分隔下一段。这应该通过CSS可视化完成。我想我们确定了您正在使用GeneratePress主题,并查看<p> 看起来这些元素的底部有一个边距,以帮助保持统一vertical rhythm 在您的网站上。既然已经定义了这个标记和样式,您可能不需要应用任何额外的CSS来调整它的外观,因为它应该与站点的其他部分相匹配。

多组phrasing content 是什么让paragraph! 纯文本也是phrasing content. 要深入了解内容模型W3C HTML5 spec 充满了你需要的和不需要知道的所有信息。不过,重要的一点是,如果我们要通过html验证器运行它,它将作为适当的标记传递,浏览器现在可以按预期显示它。

返回到<div> 我们过去经常更换<p> 这是在您的初始代码中-您可以看到我添加了page-details-with-tooltip 作为该元素的类名。如果您认为没有必要,可以删除它,但我添加了它,以便于在该特定区域的上下文中应用CSS样式,以防您想要对该区域进行任何可视化更改。还有其他(通常更好)方法来编写选择器,以便仅在WordPress中的特定上下文中引用该区域,您可以在question #275909.

我希望这能帮助您解决问题,并让您了解可能发生的一些问题,更重要的是,这些问题为什么会发生!如果不在视觉上看到问题并能够在浏览器中检查它,就很难对这种特定的东西给出明确的答案,因为有许多因素可能会导致空白-从代码到标记,再到CSS。尽管如此,我还是能够得到一些奇怪的间隔输出。在此更改之后。我仍然建议再次检查上面的#4插件设置,因为如果他们提供了一个选项来启用/禁用清理过滤器中正在解析/呈现的输出,只是为了将其从检查表中删除,那么他们可能会有一些神奇的东西!

相关推荐

为内置钩子调用do_action和Apply_Filters是否安全?

我正在开发一个插件,它需要复制一些内置的WordPress逻辑。(此逻辑不能用任何内置方法调用,也不能独立连接到。)在这个动作序列中,WordPress的正常行为是调用动作挂钩(do_action(\'wp_login\', ...)) 和过滤器挂钩(apply_filters(\'login_redirect\', ...)).如果在对应于在Core中调用它们的时间点调用它们,那么直接从我的插件调用这些内置钩子是否安全(并且是可以接受的做法)?或者,其他与此相关的开发人员期望在非常特定的时间执行操作的风