wake-up-neo.net

Programmgesteuertes Einstellen des ersten Bildes als "Vorgestellt"

Ich habe über 400 Posts mit Bildern darin. Ich habe eine neue Vorlage, die ein spezielles Bild für jeden Post erfordert, etwas, das meine letzte Vorlage nicht benötigt hat. Ich frage mich, ob es ein Skript gibt, das ich meinen Funktionen hinzufügen kann. PHP in der Lage zu sein, das erste Bild in jedem Beitrag zu greifen und es als die vorgestellten zu setzen ... Bisher habe ich dies gefunden, aber es funktioniert nicht ...

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');

Dieses Skript funktioniert für neue Beiträge, aber ich brauche es, um alle meine älteren Beiträge zu beeinflussen, irgendwelche Vorschläge?

6
user2820604

In Bezug auf den Code, den Sie gepostet haben, würde ich einige Dinge sagen:

  • sie können die Verwendung von 6 verschiedenen Aktionen vermeiden, da eine ausreicht: 'save_post' wird jedes Mal ausgelöst, wenn ein Beitrag erstellt oder aktualisiert wird
  • sie können globalize löschen. $post: 'save_post' übergibt die Beitrags-ID. Sie können sie verwenden. Wenn Sie die Funktion für den Empfang eines Arguments vorbereiten, können Sie dieselbe Funktion programmgesteuert ausführen

Die bearbeitete Version Ihres Codes wird:

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' );

Das Einzige, was Sie für alte Posts benötigen, ist, sie mit einer Abfrage abzurufen und dann für jeden Post dieselbe Funktion auszuführen.

Achten Sie einfach darauf, die Aufgabe nur einmal auszuführen: Es ist eine sehr zeit- und ressourcenintensive Aufgabe, daher sollte sie nur einmal ausgeführt werden, möglicherweise im Backend.

Ich verwende ein transient für den Zweck:

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 );
});

Nachdem Sie diesen Code Ihrem functions.php oder einem Plugin hinzugefügt haben, melden Sie sich im Backend an und warten Sie einige Sekunden, bevor das Dashboard angezeigt wird. Danach sollte jeder Beitrag ein Miniaturbild haben, zumindest jeder Beitrag, in dem ein Bild hochgeladen wurde .

Wenn alles so läuft, wie es sollte, können Sie das letzte Code-Snippet entfernen und nur das erste behalten.

Beachten Sie, dass mein Code PHP 5.3+ erfordert

3
gmazzap

Verwenden Sie diesen Code in der Funktionsdatei Ihres untergeordneten Themes und geben Sie Thumbnails neu ein

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

" Set All First Images As Featured " hat bei mir funktioniert.

Mit einem Hack könnte es den Vorgang umkehren.

Easy Add Thumbnail kann auch den Trick machen, und die Pro-Version von Quick Featured Images macht es, und ich glaube, ich habe ein anderes Plugin gesehen, das dies macht, als ich gesucht habe.

0
r_alex_hall