在运行时修改特色图像URL

时间:2017-01-17 作者:Kevin

简单的问题:我知道这可以通过某个地方的钩子来实现,但我很难准确地跟踪到需要在哪里实现它。基本上,我需要挂接到特色图像/缩略图挂钩,并动态更新图像URL。有人能帮我一把吗?我怎样才能用钩子系统做到这一点?

我基本上创建了一个帖子继承插件,作者可以通过该插件创建一个模板,然后批量生成所有从该模板继承的新帖子。这些生成的帖子是完全动态的,在运行时,在公共视图中,我的插件启动并检查活动帖子是否基于模板。如果是,插件将获取模板的内容并将其插入当前查看的帖子中。这对于标题和文本替换来说已经很好了。现在我需要做的是为这些帖子显示一个特色图片,同样基于模板的特色图片。我不想在DB中实际更新这些帖子,我只需要开发它,以便在模板调用the_post_thumbnail, 我的插件自动触发并插入图像。

我希望这能把事情弄清楚一点。

2 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

HTML生成者the_post_thumbnail() &;get_the_post_thumbnail() 可以使用post_thumbnail_html 滤器即使没有后期缩略图,也可以这样做。示例:

/**
 * Filters the post thumbnail HTML.
 *
 * @since 2.9.0
 *
 * @param string       $html              The post thumbnail HTML.
 * @param int          $post_id           The post ID.
 * @param string       $post_thumbnail_id The post thumbnail ID.
 * @param string|array $size              The post thumbnail size. Image size or array of width and height
 *                                        values (in that order). Default \'post-thumbnail\'.
 * @param string       $attr              Query string of attributes.
 */
function wpse_post_thumbnail_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    // Optionally add any logic here for determining what markup to output.
    // $html will be an empty string if there is no post thumbnail.
    $new_html = \'<img src="https://placekitten.com/g/600/600" alt="kitten">\';
    return $new_html;
}
add_action( \'post_thumbnail_html\', \'wpse_post_thumbnail_html\', 10, 5 );
上述解决方案要求主题调用the_post_thumbnail(), 但是,当帖子没有与之关联的缩略图时,它将起作用。

请注意,如果帖子没有缩略图,则上述解决方案在下面的示例中不起作用。这里,条件语句阻止has_post_thumbnail() 从被调用:

// the_post_thumbnail() will only be called if the post has a thumbnail.
if ( has_post_thumbnail() ) {
    the_post_thumbnail( \'large\' );
}
替代技术(改变现有特征图像的src值)wp_get_attachment_image_src 过滤器允许src 要修改的附件的。

此功能强大的过滤器会影响所有附件映像src值,因此有必要添加/删除附加到的回调函数wp_get_attachment_image_src 基于所需条件。

这个begin_fetch_post_thumbnail_htmlend_fetch_post_thumbnail_html 为此,行动是完美的。

下面是一些基于帖子id更改特征图像的示例代码。您可以修改此代码以使用任何必要的逻辑来确定wpse_wp_get_attachment_image_src 应添加和删除回调。

/**
 * Fires before fetching the post thumbnail HTML.
 *
 * Provides "just in time" filtering of all filters in wp_get_attachment_image().
 *
 * @since 2.9.0
 *
 * @param int          $post_id           The post ID.
 * @param string       $post_thumbnail_id The post thumbnail ID.
 * @param string|array $size              The post thumbnail size. Image size or array of width
 *                                        and height values (in that order). Default \'post-thumbnail\'.
 */
function wpse_begin_fetch_post_thumbnail_html( $post_id, $post_thumbnail_id, $size ) {
    // For example, if the post id is 1479, we will add our callback to modify the image.
    // You could use whatever logic you need to determine if the filter should be added.
    if ( 1479 === $post_id ) {
        add_filter( \'wp_get_attachment_image_src\', \'wpse_wp_get_attachment_image_src\', 10, 4 );
    }
} 
add_action( \'begin_fetch_post_thumbnail_html\', \'wpse_begin_fetch_post_thumbnail_html\', 10, 3 );

/**
 * Fires after fetching the post thumbnail HTML.
 *
 * @since 2.9.0
 *
 * @param int          $post_id           The post ID.
 * @param string       $post_thumbnail_id The post thumbnail ID.
 * @param string|array $size              The post thumbnail size. Image size or array of width
 *                                        and height values (in that order). Default \'post-thumbnail\'.
 */
function wpse_end_fetch_post_thumbnail_html( $post_id, $post_thumbnail_id, $size ) {
    // Now we remove the callback so that it only affects the desired post.
    if ( 1479 === $post_id ) {
        remove_filter( \'wp_get_attachment_image_src\', \'wpse_wp_get_attachment_image_src\', 10, 4 );
    }
} 
add_action( \'end_fetch_post_thumbnail_html\', \'wpse_end_fetch_post_thumbnail_html\', 10, 3 ); 

/**
 * Filters the image src result.
 *
 *
 * @param array|false  $image         Either array with src, width & height, icon src, or false.
 * @param int          $attachment_id Image attachment ID.
 * @param string|array $size          Size of image. Image size or array of width and height values
 *                                    (in that order). Default \'thumbnail\'.
 * @param bool         $icon          Whether the image should be treated as an icon. Default false.
 */
function wpse_wp_get_attachment_image_src( $image, $attachment_id, $size, $icon ) {
    $image[0] = \'https://placekitten.com/g/600/600\';
    return $image;
}

SO网友:Vishal Kumar Sahu

使用PHP可以。。。只需创建一个函数,复制您的特色图像并重命名它(相同的位置或不同的文件夹),然后返回新的URL。我猜你这么做是为了搜索引擎优化?您还可以借助GD库压缩图像。

Here 是堆栈帮助。这是一个我用于类似目的的函数-

function tb_get_image($image_url,$new_url,$upload_folder=""){
  $slug = $new_url;
  $uri =  WP_CONTENT_DIR."/uploads/".$upload_folder;
  $folder =  WP_CONTENT_URL."/uploads/".$upload_folder;  

  $localimage = $uri.$slug.".jpg"; #GET Extension using PHP_PATHINFO
  $image = $folder.$slug.".jpg"; #GET Extension using PHP_PATHINFO

  if(file_exists($localimage) && getimagesize($localimage)){
      return $image;
  }else{

    ...
    ...
    ...
    CODE YOU WANT TO MODIFY OR MOVE IMAGE
    MAY BE ANOTHER FUNCTION TO DO IT
    ...
    ...
    ...
    ...
    return $image;
  }
  return false;
}

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。