我正在构建一个自定义主题,并且已经为此挣扎了一段时间。我正在尝试修改的HTML输出the_post_thumbnail();
作用我需要这样做,因为我正试图在我的网站上支持视网膜图像,并且宁愿将功能烘焙到我的主题中,也不愿在后端加载插件。
默认情况下,the_post_thumbnail();
仅仅是电话get_the_post_thumbnail();
我找到的here. 我的第一个想法是插入\'post_thumbnail_html\' 过滤器,但我似乎无法让它工作。所以
这就是我在循环中调用帖子缩略图的方式:
<?php the_post_thumbnail(\'custom-thumbnail-size\', array(\'class\' => \'unique-class-here\', \'title\' => \'unique-title-here\')); ?>
这是我调用时需要输出的代码
the_post_thumbnail();
...
<img src="" alt="" data-src="image.png" data-alt="Alt text" class="retina unique-class-here" />
下面的代码是我当前函数中的代码。php文件:
<?php
function modify_post_thumbnail_html($html, $post_id, $post_thumbnail_id, $size, $attr) {
$src = wp_get_attachment_image_src(get_post_thumbnail_id(), $size);
$html = \'<img src="" alt="" data-src="\' . $src[\'0\'] . \'" data-alt="" class="retina" />\';
return $html;
}
add_filter(\'post_thumbnail_html\', \'modify_post_thumbnail_html\', 99, 5);
?>
有几件事需要注意。我不知道如何在“data alt”属性中传递适当的元数据文本。此外,我需要能够传递所需的特定post\\u缩略图大小,因为我在整个主题中使用自定义post\\u缩略图大小。最后,您可以看到除了默认的“retina”类以及该数组中的任何其他属性之外,属性数组还需要传入类。
提前感谢您的帮助。网上关于这个话题的信息真的不多,我想我的问题已经不一样了,应该在这个社区多发一篇帖子。如果您有任何想法、解决方案和/或需要澄清,请告诉我。
最合适的回答,由SO网友:kaffolder 整理而成
好吧,我想我可能已经找到了一个解决方案。这似乎不像我希望的那么简单,但对默认Wordpress功能的重大修改有时需要采取极端措施。:)
这是我的工作解决方案,用于重写整个网站的帖子缩略图的HTML输出,以使用Retinise.js 插件。当然,这段代码可能适用于其他缩略图后HTML操作。
在我的功能中。php文件,我创建了以下函数:
<?php
function modify_post_thumbnail_html($html, $post_id, $post_thumbnail_id, $size, $attr) {
$id = get_post_thumbnail_id(); // gets the id of the current post_thumbnail (in the loop)
$src = wp_get_attachment_image_src($id, $size); // gets the image url specific to the passed in size (aka. custom image size)
$alt = get_the_title($id); // gets the post thumbnail title
$class = $attr[\'class\']; // gets classes passed to the post thumbnail, defined here for easier function access
// Check to see if a \'retina\' class exists in the array when calling "the_post_thumbnail()", if so output different <img/> html
if (strpos($class, \'retina\') !== false) {
$html = \'<img src="" alt="" data-src="\' . $src[0] . \'" data-alt="\' . $alt . \'" class="\' . $class . \'" />\';
} else {
$html = \'<img src="\' . $src[0] . \'" alt="\' . $alt . \'" class="\' . $class . \'" />\';
}
return $html;
}
add_filter(\'post_thumbnail_html\', \'modify_post_thumbnail_html\', 99, 5);
?>
然后,每当我打电话
the_post_thumbnail();
在WP循环中,我使用以下代码:
<?php the_post_thumbnail(\'custom-thumbnail-size\', array(\'class\' => \'retina additional-class\')); ?>
如果您在WP循环之外操作,则此代码应该可以工作(显然需要稍加修改)。希望这能为其他人节省一些时间和沮丧!也许当我开始讨论它时,我会发布一个完整的开始到结束的Q&;一个关于我是如何在视网膜支持我的主题。没有使用插件!
如果有兴趣的话,这里有一些链接可以为你指明正确的方向!
SO网友:Sebastian Schmid
黑客解决方案:
由于wordpress在默认情况下向<img>
, 如果不强制更改该行为,则始终可以在字符串之前通过str\\u replace“注入”某些内容class=
. In代码:
$image = get_the_post_thumbnail( $post->ID, \'medium\', array( \'class\' => \'myclass\' ) );
$moreattrs = \'data-fullimg= "full.jpg"\';
$image = str_replace(\'class=\', $moreattrs.\' class=\', $image );
可以很安全地假设,如果某个东西以“class=”开头,那就是您想要的。当然,它可能会被包含这些内容的奇怪文件名搞砸
class=
, 但尤其是wordpress,这是极不可能的。
您还可以搜索<img
并更换;想一想,我想这样应该安全一点。
SO网友:Simon
也许你可以wp_get_attachment_image_attributes
:
function my_custom_image_attributes( $attr, $attachment ) {
remove_filter(\'wp_get_attachment_image_attributes\',\'my_custom_image_attributes\');
$image = wp_get_attachment_image_src( $attachment->ID, \'full\' );
$attr[\'data-src\'] = $image[0];
$attr[\'data-alt\'] = $attachment->post_title;
$attr[\'class\'] .= \' retina\';
return $attr;
}
add_filter(\'wp_get_attachment_image_attributes\',\'my_custom_image_attributes\');
这需要测试,可能需要修改,我在这里找到了想法
Add class name to post thumbnail (检查
vwp_get_attachment_image
最后是源代码)。
您需要在调用之前添加挂钩the_post_thumbnail()
在您的主题中。
还有,我不知道你需要用什么作为data-alt
, 在我看来,您可以使用attachement
随过滤器一起通过(可以是自定义字段)。