it-swarm.com.de

So stellen Sie das vorgestellte Bild programmgesteuert auf benutzerdefinierte Posts von außerhalb ein

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 setzt?

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 ??

13
Faisal Shehzad

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;
            }
        }
    }
}
24
GhostToast

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

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;
}
1
hitautodestruct

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

}
}
1
Liz Eipe C

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 davon 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 uploadFile -Methode 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(), um den Upload-Verzeichnispfad abzurufen, und sanitize_file_name(), um den Pfad zu erstellen und die Datei an den resultierenden Speicherort zu schreiben.
  3. Verwenden Sie wp_insert_attachment(), um den Anhang in der Datenbank zu speichern (wp_check_filetype() ist hilfreich zum Festlegen von post_mime_type). Optional können Sie auch post_parent und den _thumbnail_id Metaschlüssel festlegen, 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 wenig sicherer zu machen.
0
Simon