it-swarm.com.de

So prüfen Sie vor dem Hochladen, ob ein Bildanhang vorhanden ist

Ich versuche, Bilder programmgesteuert in WP hochzuladen, um zu überprüfen, ob bereits ein Bild mit demselben Namen vorhanden ist. Ich mache das aus einem Plugin heraus, im Admin-Bereich über add_submenu_page().

Ich verwende eine foreach(), um 2 Bilder pro Post hochzuladen, und ich gebe ihnen einen Namen, der auf dem Slug meines Posts basiert, aber nur einer von ihnen wird korrekt in WP gefunden und weggelassen, der andere wird immer neu hochgeladen zu WP, auch wenn es existiert.

Hier ist der relevante Code:

// sample vars
$slug = 'my-post-slug';
$card['img'] = 'http://example.com/img1.jpg';
$card['imgGold'] = 'http://example.com/img2.jpg';
// end sample vars

$images = '';
$images[] = $card['img'];
$images[] = $card['imgGold'];
foreach ( $images as $url ) {

    // check if current url is for regular or gold image
    if ( $card['imgGold'] == $url ) {
        $desc = $slug .'-gold';
    } else {
        $desc = $slug;
    }

    // check if attachment already exists
    $attachment_args = array(
        'posts_per_page' => 1,
        'post_type'      => 'attachment',
        'name'           => $desc
    );
    $attachment_check = new Wp_Query( $attachment_args );

    // if attachment exists, reuse and update data
    if ( $attachment_check->have_posts() ) {

        echo 'Attachment <strong>'. $desc .'</strong> found, omitting download...<br>';

        // do stuff..

    // if attachment doesn't exist fetch it from url and save it
    } else {

        echo 'Attachment <strong>'. $desc .'</strong> not found, downloading...<br>';

        // handle image upload from url and assign to post
        $src = media_sideload_image( $url, $post_id, $desc, 'src' );

        // add post meta
        if ( $card['imgGold'] == $url  ) {
            add_post_meta( $post_id, 'imgGold', $src );
        } else {
            add_post_meta( $post_id, 'img', $src );
        }

    } // end attachment exists

} // end foreach image

Das Goldbild ist dasjenige, das wie beabsichtigt funktioniert. Der reguläre wird immer neu hochgeladen. Keine Ahnung warum, danke für jede Hilfe!

2
Yogensia

OK, ich habe endlich das Problem gefunden! Ich habe versucht, dem Anhang und dem übergeordneten Post den gleichen Slug zuzuweisen, und anscheinend wird WordPress das nicht haben. Der "Name" in der Medienbibliothek für den Anhang war korrekt, aber die tatsächliche Schnecke wurde am Ende ein -2.

Hier ist der feste Code, einfach durch Eindeutigkeit der Image-Slugs :

// sample vars
$slug = 'my-post-slug';
$card['img'] = 'http://example.com/img1.jpg';
$card['imgGold'] = 'http://example.com/img2.jpg';
// end sample vars

$images = '';
$images[] = $card['img'];
$images[] = $card['imgGold'];
foreach ( $images as $url ) {

    // check if current url is for regular or gold image
    if ( $card['imgGold'] == $url ) {
        $desc = $slug .'-img-gold';
    } else {
        $desc = $slug .'-img';
    }

    // check if attachment already exists
    $attachment_args = array(
        'posts_per_page' => 1,
        'post_type'      => 'attachment',
        'name'           => $desc
    );
    $attachment_check = new Wp_Query( $attachment_args );

    // if attachment exists, reuse and update data
    if ( $attachment_check->have_posts() ) {

        echo 'Attachment <strong>'. $desc .'</strong> found, omitting download...<br>';

        // do stuff..

    // if attachment doesn't exist fetch it from url and save it
    } else {

        echo 'Attachment <strong>'. $desc .'</strong> not found, downloading...<br>';

        // handle image upload from url and assign to post
        $src = media_sideload_image( $url, $post_id, $desc, 'src' );

        // add post meta
        if ( $card['imgGold'] == $url  ) {
            add_post_meta( $post_id, 'imgGold', $src );
        } else {
            add_post_meta( $post_id, 'img', $src );
        }

    } // end attachment exists

} // end foreach image
2
Yogensia