如何更改/修改_POST_THMBAILE();html输出?

时间:2014-02-09 作者:kaffolder

我正在构建一个自定义主题,并且已经为此挣扎了一段时间。我正在尝试修改的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”类以及该数组中的任何其他属性之外,属性数组还需要传入类。

提前感谢您的帮助。网上关于这个话题的信息真的不多,我想我的问题已经不一样了,应该在这个社区多发一篇帖子。如果您有任何想法、解决方案和/或需要澄清,请告诉我。

3 个回复
最合适的回答,由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 随过滤器一起通过(可以是自定义字段)。

结束

相关推荐

如何模拟PHPUnit的HTTP请求?

我正在编写一个插件,向Facebook graph API发出请求。由于我不希望我的单元测试实际发出这些请求,我该如何克服这一问题?我的方法同时调用wp_remote_get 和wp_remote_post. 在那里搜索似乎是一种模拟函数的方法runkit, here我希望避免让贡献者需要太多依赖项,因此希望避免使用上述方法。还有其他选择吗?我的类扩展了WP_UnitTestCase 所以我希望wp单元测试中有一些我可以使用的东西?