So stellen Sie das vorgestellte Bild programmgesteuert auf einen benutzerdefinierten Beitrag von außerhalb ein

13

Ich versuche, Bilder außerhalb der WordPress-Umgebung zu einem benutzerdefinierten Post über PHP abzurufen und einzufügen.

Wie man das Bild in das WordPress-Upload-Verzeichnis verschiebt / hochlädt, wie man es in WordPress tut und das Bild gegen den benutzerdefinierten Beitrag auf das empfohlene Bild einstellt?

Auch um ein Bild in die benutzerdefinierte Post-Galerie hochzuladen?

Unten ist mein Code

$filename = $image['name'];
$target_path = "../wp-content/uploads/";
$target_path = $target_path . $filename;
$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
    'guid' => $wp_upload_dir['baseurl'] . '/' . basename( $filename ),
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
    'post_content' => '',
    'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $attachment, $target_path, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
set_post_thumbnail( $post_id, $attach_id );

Ich habe es geschafft, das Bild in mein Upload-Verzeichnis hochzuladen, kann aber den Ordner für Jahr und Datum nicht erstellen. das gibt es irgendeine wp funktion dafür ??

Faisal Shehzad
quelle

Antworten:

27

Kann das nicht einfach mit media_sideload_image () gemacht werden ?

Scheint ziemlich einfach. Der einzige Haken ist, wenn Sie nicht im Admin-Bereich sind, müssen Sie einige Bibliotheken aus WordPress-Includes einbinden:

// only need these if performing outside of admin environment
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');

// example image
$image = 'http://example.com/logo.png';

// magic sideload image returns an HTML image, not an ID
$media = media_sideload_image($image, $post_id);

// therefore we must find it so we can set it as featured ID
if(!empty($media) && !is_wp_error($media)){
    $args = array(
        'post_type' => 'attachment',
        'posts_per_page' => -1,
        'post_status' => 'any',
        'post_parent' => $post_id
    );

    // reference new image to set as featured
    $attachments = get_posts($args);

    if(isset($attachments) && is_array($attachments)){
        foreach($attachments as $attachment){
            // grab source of full size images (so no 300x150 nonsense in path)
            $image = wp_get_attachment_image_src($attachment->ID, 'full');
            // determine if in the $media image we created, the string of the URL exists
            if(strpos($media, $image[0]) !== false){
                // if so, we found our image. set it as thumbnail
                set_post_thumbnail($post_id, $attachment->ID);
                // only want one image
                break;
            }
        }
    }
}
GhostToast
quelle
1
Diese Lösung funktioniert wie ein Zauber (y)
Omar Tariq
Wo kann ich diesen Code hinzufügen?
er.irfankhan11
1
Ab WordPress 4.8 können Sie den vierten Parameter media_sideload_imageauf setzen 'id'und es wird die neue Anhang-ID zurückgegeben. ZB:$new_att_id = media_sideload_image($image, $post_id, "image description...", 'id'); if(!is_wp_error($new_att_id)) { set_post_thumbnail($post_id, $new_att_id); }
Don Wilson
1

Probieren Sie diese Erklärung zum Hochladen mit einem Pfad und einer Beitrags-ID aus .

Hier ist der Code (für Legacy):

/* Import media from url
 *
 * @param string $file_url URL of the existing file from the original site
 * @param int $post_id The post ID of the post to which the imported media is to be     attached
 *
 * @return boolean True on success, false on failure
 */

function fetch_media($file_url, $post_id) {
require_once(ABSPATH . 'wp-load.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
global $wpdb;

if(!$post_id) {
    return false;
}

//directory to import to    
$artDir = 'wp-content/uploads/2013/06';

//if the directory doesn't exist, create it 
if(!file_exists(ABSPATH.$artDir)) {
    mkdir(ABSPATH.$artDir);
}

//rename the file
$ext = array_pop(explode("/", $file_url));
$new_filename = 'blogmedia-'.$ext;

if (@fclose(@fopen($file_url, "r"))) { //make sure the file actually exists
    copy($file_url, ABSPATH.$artDir.$new_filename);


    $siteurl = get_option('siteurl');
    $file_info = getimagesize(ABSPATH.$artDir.$new_filename);

    //create an array of attachment data to insert into wp_posts table
    $artdata = array();
    $artdata = array(
        'post_author' => 1, 
        'post_date' => current_time('mysql'),
        'post_date_gmt' => current_time('mysql'),
        'post_title' => $new_filename, 
        'post_status' => 'inherit',
        'comment_status' => 'closed',
        'ping_status' => 'closed',
        'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $new_filename)),                                            'post_modified' => current_time('mysql'),
        'post_modified_gmt' => current_time('mysql'),
        'post_parent' => $post_id,
        'post_type' => 'attachment',
        'guid' => $siteurl.'/'.$artDir.$new_filename,
        'post_mime_type' => $file_info['mime'],
        'post_excerpt' => '',
        'post_content' => ''
    );

    $uploads = wp_upload_dir();
            $save_path = $uploads['basedir'].'/2013/06/'.$new_filename;

    //insert the database record
    $attach_id = wp_insert_attachment( $artdata, $save_path, $post_id );

    //generate metadata and thumbnails
    if ($attach_data = wp_generate_attachment_metadata( $attach_id, $save_path)) {
        wp_update_attachment_metadata($attach_id, $attach_data);
    }

    //optional make it the featured image of the post it's attached to
    $rows_affected = $wpdb->insert($wpdb->prefix.'postmeta', array('post_id' => $post_id, 'meta_key' => '_thumbnail_id', 'meta_value' => $attach_id));
}
else {
    return false;
}

return true;
}
hitautodestruct
quelle
1

Bitte beziehen Sie sich auf den folgenden Code, der das vorgestellte Bild programmgesteuert festlegt. http://www.pearlbells.co.uk/code-snippets/set-featured-image-wordpress-programmatically/

function setFeaturedImages() {

$base = dirname(__FILE__);
$imgfile= $base.DS.'images'.DS.'14'.DS.'Ascot_Anthracite-Grey-1.jpg';
$filename = basename($imgfile);
$upload_file = wp_upload_bits($filename, null, file_get_contents($imgfile));
if (!$upload_file['error']) {
    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_parent' => 0,
        'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], 209 );

if (!is_wp_error($attachment_id)) {
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    $attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
    wp_update_attachment_metadata( $attachment_id,  $attachment_data );
}

set_post_thumbnail( 209, $attachment_id );

}
}
Liz Eipe C
quelle
0

Vielleicht habe ich ein Missverständnis, aber warum sollten Sie das außerhalb der WordPress-Umgebung tun? Diese Funktionalität zu replizieren wäre eine Menge Arbeit! WordPress kann viel mehr als nur die Datei hochladen und in einem bestimmten Verzeichnis ablegen. Beispielsweise können Sie steuern, welche Benutzer Dateien hochladen dürfen, Datenbankeinträge zum Hochladen hinzufügen und Bildbeziehungen einrichten sowie Aktionen und Filter für externe Plugins ausführen, die von diesen abhängig sind Datei-Upload - alles unter Einhaltung der Site-Einstellungen (in Bezug auf Namenskonventionen, Speicherort des Medien-Uploads usw.).

Wenn Sie einfach Dateien hochladen möchten, ohne im WordPress-Administratorbereich angemeldet zu sein, beispielsweise um Dateien von einer externen Site hochzuladen, sollten Sie sich die XML-RPC-API und insbesondere die uploadFileMethode ansehen .

Eine andere Möglichkeit könnte darin bestehen, eine Mini-API selbst zu schreiben. Grundsätzlich möchten Sie Folgendes tun:

  1. Laden Sie die Datei auf den Server hoch (oder laden Sie sie von einem angegebenen URL vom Server herunter).
  2. Verwenden Sie wp_upload_dir()diese Option , um den Upload-Verzeichnispfad abzurufen sanitize_file_name(), den Pfad zu erstellen und die Datei an den resultierenden Speicherort zu schreiben.
  3. Verwenden Sie wp_insert_attachment()diese Option , um den Anhang in der Datenbank zu speichern ( wp_check_filetype()dies ist für die Einstellung hilfreich post_mime_type). Optional können Sie auch post_parentden _thumbnail_idMeta-Key setzen und wenn Sie möchten.
  4. Stellen Sie Ihre API externen Benutzern zur Verfügung, oder fordern Sie bei Bedarf eine Anmeldung an. Wenn Sie mindestens ein öffentliches Formular verwenden, verwenden Sie wp_create_nonce()und wp_verify_nonce(), um das Formular ein kleines bisschen sicherer zu machen.
Simon
quelle
Ich schreibe einen Web-Service für eine Anwendung. Die Anwendung sendet mir ein FILE-Array, über das ich die Post-Daten und das Bild einfügen möchte. Ich habe die Post-Details in die Datenbank eingefügt, aber im Bildteil festgehalten.
Faisal Shehzad
Schau in der Dokumentation nach wp_insert_attachment(), es sollte viel tun, was du brauchst, denke ich. Ich würde dringend davon abraten, die Datenbank manuell außerhalb von WordPress zu ändern, wenn Sie dies tun. Schauen Sie sich stattdessen einfach die WordPress-Quelle an und versuchen Sie, die Teile zu identifizieren, die für das Hinzufügen von Post-Daten, das Bearbeiten von Datei-Uploads und das Einfügen von Anhängen verantwortlich sind. Mit anderen Worten, ziemlich genau das, was ich oben in meiner Antwort skizziert habe.
Simon
@ Simon Ich habe das gleiche Problem. Ein weiterer Grund für das Hochladen ist, dass Sie einen Stapel von Bildern haben, die Sie an verschiedene Posts anhängen möchten, und dies nicht manuell.
hitautodestruct
1
@hitautodestruct: Ich mache das auf jeden Fall oft, wenn ich Daten von vorhandenen Sites, Legacy-Systemen, Datenbankexporten usw. migriere. Mein Punkt ist, dass Sie immer versuchen sollten, die WordPress-Kernfunktionalität zu nutzen, um dies zu erreichen, anstatt nur ein Skript von Ihnen zu schreiben Eigenes, das die Bilder an der richtigen Stelle platziert (was zu einem gewissen Grad das war, worum es meiner Meinung nach bei der Frage ging).
Simon