加粗特定单词/小部件标题的部分

时间:2018-01-03 作者:cplus

有没有办法加粗特定单词或小部件标题的一部分?例如,标题“Foo Bar”,“Foo”在这里是粗体的。

我尝试了以下操作,但在标题中输出了跨度:

add_filter( \'widget_title\', \'test\', 10, 1);
function test( $content ) {
    $test = explode(\' \', $content);

    if ( !empty($test[1] ) ) {
        $title = \'<span class="this_is_bold">\' . $test[0] . \'</span>\';
        $title = $title . \' \' . $test[1];
    }

    return $title;
}

3 个回复
SO网友:David Sword

这会将我的小部件标题的第一个单词(或整个单词,如果只有一个)加粗:

add_filter( \'widget_title\', function ( $title ) {
    return preg_replace("/^(.+?)( |$)/", "<strong>$0</strong>", $title, 1);
}, 10, 1);
打破regex模式,我们有:

  • ^ 是行的开头(.+?) 在我们的下一组人之间有什么(在本文中,是一个词)
  • ( |$) 表示第一个空格或行尾。第一个空格是一个包含多个单词的普通标题。行尾表示找不到空格,因此标题中只有一个单词preg_replace(), 我们将第四个属性设置为1, 这是极限。这意味着替换只能在第一个实例上工作(我们知道,在这种情况下,这并不重要$title 总是一条线,因为我们的线锚^ 我们知道它只能工作一次——但嘿,为什么不呢)。

    请记住,我把代码放在一个匿名函数中,以获得最少的代码(炫耀)。如果这是针对插件或公共主题的,最好还是像最初那样执行函数调用。

SO网友:scytale

通常WP不允许html标记<> 输入,但允许“[“&;”]“。所以一个简单的解决方法是将say say“This is[b]bold[/b]”转换为“This isbold“。

在您自己的小部件中you don\'t even need to use add_filter; 类似于:

$title = str_replace( array("[b]","[/b]"), array("<b>","</b>"), apply_filters(\'widget_title\', $title));
(然后,像往常一样,稍后通过回显$title来呈现小部件标题)should do the trick.

您的问题涉及add_filter; 如果需要使用此功能,则此功能很简单,可以轻松地扩展到其他HTML标记:

function bold_widget_title( $title) { 
  $title = str_ireplace( array(\'[b]\',\'[/b]\') , array(\'<b>\',\'</b>\'), $title); 
  return $title; 
}
add_filter( \'widget_title\', \'bold_widget_title\' ); 
//  the arrays can be extended for other tags e.g "<br>" to allow you to choose where a long title is split to a new line.
允许用户输入实际的HTML标记是可能的,但事后看来,我不建议这样做。在一个小部件中,我允许用户同时输入<br> 标签和[br]但是如何做到这一点对于小部件来说是非常具体的。

关于如何操作的一些提示:

告诉WP允许<b> 用户标题输入中的标记,例如。

$instance[\'title\'] = wp_kses($new_instance[\'title\'], array(\'b\'=>array() ), array() );
为避免滤清器拆卸:更换<b>s和</b>s与[] 保存前的版本

准备好渲染,例如。

$title =  str_replace ( array("[b]","[/b]") , array("<b>","</b>") , apply_filters(\'widget_title\', str_ireplace(array("[b]","[/b]"), array("<b>","</b>"),$title)));

SO网友:scytale

看到您的评论后,我现在假设您希望更改任何小部件标题,而不考虑用户输入。所以新的答案(我留下了旧的,可能对其他人有用)。

当我把第一个加粗的词扔掉时,我看到了它,但是<;strong>;当页面呈现时,标记显示在实际标题中

像David一样,我在函数中找到代码。当add\\u filter的优先级为10(如您的示例所示)时,php会正确添加(非转义)粗体标记。

在您的站点上,似乎该功能正在添加您的标记,但稍后的过程(WP或某些插件)会使它们无法转换<&lt;

通过“降低”功能的优先级,使其在其他add\\u过滤器之后运行可能会起作用,例如:。add_filter(\'widget_title\', \'test\', 999999, 1);

如果没有,可以在函数中尝试此操作。php

remove_filter( \'widget_title\', \'esc_html\' ); // remove filter that may be added elsewhere

function bold_first_word( $title ) {  
  $title = trim(esc_html($title)); // re-apply escaping BEFORE bolding
  // or use wp_kses to remove tags except those specified (but don\'t allow bold tags)

  if (empty($title)) return $title;
  // some code to bolden first or only word (see below)
}
add_filter( \'widget_title\', \'bold_first_word\', 10, 1);
在不使用正则表达式的情况下将第一个单词加粗:

$first_space = strpos($title, \' \');
if ($first_space !== false) {
    return \'<strong>\' . substr_replace($title, \'</strong> \', $first_space, 1);
} else {
    return \'<strong>\' . $title . \'</strong>\';
}
注意:即使您的函数正在工作,也不会使用少数不工作的小部件插件调用它(即工作)apply_filter(\'widget_title\', ... 或者有一些不寻常的标题逻辑。

结束

相关推荐

Using add_filter() in Widgets

只需查询引用add_filter() 作用您可以在WordPress小部件类中使用此函数吗。Example我有一个带有动态创建代码的小部件,我想将其传递给插件中创建的另一个函数。这能实现吗?<?php /** * Display the actual Widget * * @param Array $args * @param Array $instance */ public function widget($args, $inst