web-dev-qa-db-ja.com

プログラムで最初の画像をおすすめとして設定

内部に画像を含む400以上の投稿があります。各投稿におすすめの画像を必要とする新しいテンプレートがあります。最後のテンプレートには必要なかったものです。各投稿の最初の画像をつかみ、注目のものとして設定できるようにするためのphp ...これまでのところ私はこれを見つけましたが、それは動作していません...

function auto_set_featured() {
global $post;
$has_thumb = has_post_thumbnail($post->ID);
if (!$has_thumb)  {
$attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
    if ($attached_image) {
        foreach ($attached_image as $attachment_id => $attachment) {
            set_post_thumbnail($post->ID, $attachment_id);
        }
    }
}
}
add_action('the_post', 'auto_set_featured');
add_action('save_post', 'auto_set_featured');
add_action('draft_to_publish', 'auto_set_featured');
add_action('new_to_publish', 'auto_set_featured');
add_action('pending_to_publish', 'auto_set_featured');
add_action('future_to_publish', 'auto_set_featured');

このスクリプトは新しい投稿に機能しますが、古い投稿すべてに影響を与えるために必要です。

6
user2820604

あなたが投稿したコードに関して、私はいくつかのことを言うでしょう:

  • 'save_post'は投稿が作成されたり更新されたりするたびに起動されます。
  • globalize $postを落とすことができます:'save_post'はポストIDを渡します、それに加えて、引数を受け取るために関数を準備することはあなたがプログラム的に同じ関数を実行するのを助けるでしょう

あなたのコードの編集版は次のようになります。

function auto_set_featured( $post = NULL ) {
  // retrieve post object
  $post = get_post( $post ); 
  // nothing to do if no post, or post already has thumbnail
  if ( ! $post instanceof WP_Post || has_post_thumbnail( $post->ID ) )
     return;
  // prepare $thumbnail var
  $thumbnail = NULL;
  // retrieve all the images uploaded to the post
  $images    = get_posts( array(
    'post_parent'    => $post->ID,
    'post_type'      => 'attachment',
    'post_status'    => 'inherit',
    'post_mime_type' => 'image',
    'posts_per_page' => 1
  ) );
  // if we got some images, save the first in $thumbnail var
  if ( is_array( $images ) && ! empty( $images ) )
     $thumbnail = reset( $images );
  // if $thumbnail var is valid, set as featured for the post
  if ( $thumbnail instanceof WP_Post )
     set_post_thumbnail( $post->ID, $thumbnail->ID );
}

add_action( 'save_post', 'auto_set_featured' );

さて、あなたが古い投稿に必要な唯一のことは、クエリでそれらを検索して、それからすべての投稿に対して同じ関数を実行することです。

ただ一度だけタスクを実行するように注意してください:それは非常に時間とリソースを消費するタスクです、それでそれはおそらくバックエンドで一度だけ実行されるべきです。

目的のために transient を使用します。

add_action( 'admin_init', function() {

  if ( (int) get_transient(' bulk_auto_set_featured' ) > 0 )
     return;

  $posts = get_posts( 'posts_per_page=-1' ) ;
  if ( empty( $posts ) )
    return;

  array_walk( $posts, 'auto_set_featured' );

  set_transient( 'bulk_auto_set_featured', 1 );
});

このコードをあなたのfunctions.phpまたはプラグインに追加した後、バックエンドにログインし、ダッシュボードが表示されるまで数秒待つように準備してください。ただし、すべての投稿にサムネイルがあるはずです。 。

すべてがうまくいったら、最初のコードだけを残して最後のコードスニペットを削除できます。

私のコードにはPHP 5.3以降が必要です。

3
gmazzap

このコードをあなたの子供用テーマ関数ファイルとそれに使用してください サムネイルを再生成

function wpsites_auto_set_featured_image() {
      global $post;
      $featured_image_exists = has_post_thumbnail($post->ID);
          if (!$featured_image_exists)  {
          $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                      if ($attached_image) {
                            foreach ($attached_image as $attachment_id => $attachment) {
                            set_post_thumbnail($post->ID, $attachment_id);
                            }
                       }
                    }
  }
add_action('the_post', 'wpsites_auto_set_featured_image');
2
Brad Dalton

すべての最初の画像をおすすめとして設定 」がうまくいきました。

ハッキングすると、操作が逆転する可能性があります。

サムネイルを簡単に追加 トリックを行うことができます。また クイックおすすめイメージのプロ版 それを実行します。検索したときにこれを実行する別のプラグインが表示されたと思います。

0
r_alex_hall