使用快捷码设置发布图像

时间:2015-12-14 作者:Patrick

如何使用快捷码的内容设置帖子的特色图像?例如,以下快捷码应将帖子的特色图像设置为www.google.de/nicepic.jpg:

[post_image]www.google.de/nicepic.jpg[/post_image]

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

Shortcode API更适合于更改帖子内容,而不是执行响应内容的操作,因此需要更多的创造力来更改其他帖子数据,尽管仍然可以这样做。最后,考虑到您可以通过单击post editor UI中的按钮来完成相同的操作,使用短代码设置特色图像有点奇怪。

我强调,我下面的解决方案是未经测试的黑客,依赖于以非标准方式使用WordPress组件

溶液使用the Plugin APIwrite a plugin 使用the Shortcode APIregister your shortcode.

为了将远程图像设置为特色图像,您需要下载图像,将其移动到永久位置(例如wp-content/uploads), 将其附加到帖子上,然后设置特色图像。有几种方法可以做到这一点,但我认为最简单的方法是

使用download_url() 将远程映像下载到临时目录handle_media_sideload() 将文件移动到wp-content/uploads, 生成附件元数据,并将其附加到帖子set_post_thumbnail() 将其指定为特征图像handle_media_sideload() 和set_post_thumbnail() 两者都需要post的ID,并且不会向shortcode回调传递post ID或post对象本身。当短代码应用于通过全局$post 对象,但在该点应用上述操作可能会导致每次显示帖子时下载并设置图像。

实现此攻击的一个可能的解决方法是使用类属性传递帖子ID,并从短代码回调中提前返回,短代码的内容未被修改。

另一种解决方案可能是,在保存帖子时(例如save_post). 仍然可以注册短代码以返回空字符串。类似于

$featured_image_shortcode = \'post_image\';

wpse_211802_featured_image_shortcode( $atts, $content ) {
  return \'\';
}

add_shortcode( $featured_image_shortcode, \'wpse_211802_featured_image_shortcode\' );

wpse_211802_featured_image_from_shortcode_url( $post_id ) {
  $content           = get_the_content( $post_id );
  $shortcode_matches = array();
  
  if( ! has_shortcode( $content, \'post_image\' ) )
    return;
  
  preg_match_all( \'\\[\' . $featured_image_shortcode . \'\\](.*)\\[\\/\' . $featured_image_shortcode . \'\\]\', $content, $shortcode_matches );
  
  $url      = $shortcode_matches[ 1 ][ 0 ];
  $tempfile = download_url( $url );
  
  if( is_wp_error( $tempfile ) ){
    // download failed, handle error
    return;
  }

  // Set variables for storage
  preg_match( \'/[^\\?]+\\.(jpg|jpe|jpeg|gif|png)/i\', $url, $matches );

  $desc       = \'Featured Image for Post \' . $post_id;
  $file_array = array(
    \'name\'     => basename( $matches[0] ),
    \'tmp_name\' => $tempfile
  );

  // Sideload the downloaded file as an attachment to this post
  $attachment_id = media_handle_sideload( $file_array, $post_id, $desc );

  // If errors encountered while sideloading, delete the downloaded file
  if ( is_wp_error( $attachment_id ) ) {
    @unlink( $tempfile );
    return;
  }
  
  // If all went well, set the featured image
  set_post_thumbnail( $post_id, $attachment_id );
}

add_action( \'save_post\', \'wpse_211802_featured_image_from_shortcode_url\' );
您可能需要require_once() 其他文件,以便上述功能正常运行。如果您做了类似的事情,我建议扩展错误处理和URL验证。

尽管如此,只需使用post editor UI上的按钮设置特色图像就可以轻松得多。

SO网友:Manu

不是一个完整的答案,但可能是一个正确方向的暗示。。。

就保存的数据而言,特征图像实际上是一个名为_thumbnail_id 它保存图像附件的数字ID。

将帖子导出为XML时,显示如下:

<wp:postmeta>
  <wp:meta_key>_thumbnail_id</wp:meta_key>
  <wp:meta_value><![CDATA[1497]]></wp:meta_value>
</wp:postmeta>`
因此,您可以尝试通过使用add_post_meta().

不过,使用外部图像URL并不容易,因为WordPress不允许将其用于特色图像。

相关推荐

Shortcode based chart plugin

有谁知道一个WP插件可以根据短代码参数生成图表吗?i、 e.像这样的[chart type=\"bar\" values=\"1,2,4,7,3\"], [chart type=\"pie\" values=\"43,32,38\"] 所以不需要上传。txt/。csv文件,使用谷歌工作表等。谢谢PS:由于我们网站的工作方式(数据库生成一些内容),我们需要基于短代码。