在帖子图像下方显示图像描述和嵌入链接

时间:2016-02-02 作者:TheLearner

我的Wordpress帖子中有以下字段设置的图像:

标题:此字段包含要显示在图像下方的实际图像标题。

描述:此字段包含带有属性源链接的照片信用。

我需要将这两个值显示在图像的正下方,如下所示:

enter image description here

从@toscho的精彩回答中获得线索this 问题,我尝试了此功能:

add_shortcode(\'wp_caption\', \'img_caption_add_description\');
add_shortcode(\'caption\', \'img_caption_add_description\');
function img_caption_add_description($attr, $content = null)
{
    $post_id = str_replace(\'attachment_\', \'\', $attr[\'id\']);
    $img = get_post((int)$post_id);

    if (is_a($img, \'WP_Post\')) {
        $attr[\'caption\'] = $img->post_content;
    }

    return img_caption_shortcode($attr, $content);
}
正如您在屏幕截图中所看到的,该函数除了去掉所有超链接外,其他功能都做得很好。我需要他们!有没有办法修改上述功能,使其尊重链接?例如,在上述示例中,文本“Amit Schandillia”和“CC BY-SA 3.0”都是超链接。我在我的描述字段中有如下链接:

Photo credit: <a href="" target="_blank" rel="nofollow">Amit Schandillia</a> licensed <a href="" target="_blank" rel="nofollow"><i class="fa fa-creative-commons"></i> BY-SA 3.0</a>
如何确保<a> 标签在贴子页面上呈现时是否保持不变?

1 个回复
SO网友:kaiser

当你看最后一行img_caption_shortcode(), 然后你可以看到wp_kses() 正在剥离不允许的HTML标记。这个wp_kses_hook() 函数仅包装筛选器:

return apply_filters( \'pre_kses\', $string, $allowed_html, $allowed_protocols );
允许在wp_kses_split() 最后使用删除HTML标记preg_replace_callback 具有_wp_kses_split_callback() 作为移除标签的功能。

与内部一样_wp_kses_split_callback(), 这个wp_kses_split2() 函数被调用时,您还有一个(糟糕的)选择:更改全局。

回调中有以下两个全局变量:

global $pass_allowed_html, $pass_allowed_protocols;
这意味着您还可以执行以下操作(不推荐):

// Fetch the global context
global $pass_allowed_html;
// Save the global context for restoring it to not nuke other code
$temp = $pass_allowed_html;
// Alter the context
$GLOBALS[\'pass_allowed_html\'] = [ /* your allowed HTML tags here */ ];
// Fetch the result
$result = img_caption_shortcode();
// Reset the global context
$GLOBALS[\'pass_allowed_html\'] = $temp;
// Return your altered result
return $result;
请记住wp_kses_allowed_html() 然后会触发explicit 案例

img_caption_shortcode() 仅通过string 有价值的postwp_kses(), 你也可以从以下几行中获利wp_kses_split2():

if ( ! is_array( $allowed_html ) )
    $allowed_html = wp_kses_allowed_html( $allowed_html );
正在查看[wp_kses_allowed_html()] 再次强调:

return apply_filters( \'wp_kses_allowed_html\', $allowedposttags, $context );
您可以简单地使用此过滤器。确保您remove the filter again 运行后,它不会与其他内容冲突,因此会意外地允许标记在其他地方。

相关推荐

搜索词-在同一个词查询中查询Description__Like或Name__Like?

在我的主题中search.php 我设置了一个部分来显示适合搜索的术语。如果$keyword 出现在术语的标题或描述中。我已经设置好这样做了,但是如果我觉得必须进行两个单独的查询很笨拙,那么就删减结果,确保每个术语只显示一次。 $search_matters_args = array( \'taxonomy\' => array(\'book\', \'magazine\'), // taxonomies to search \'orderby\' =