Öne çıkan görüntüyü program dışından özel gönderiye ayarlama


13

PHP ile özel bir yazı wordpress ortamı dışında görüntüleri getirmek ve eklemek çalışıyorum.

Bu görüntüyü wordpress'in yaptığı gibi wordpress yükleme dizini yıl tarih klasörü biçimine nasıl taşıyabilir / yükleyebilir ve bu görüntüyü özel gönderiye karşı özellikli görüntüye nasıl ayarlayabilirim?

Ayrıca özel yayın galerisine resim yüklemek mi istiyorsunuz?

Kodum aşağıda

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

resmi yüklemeler dizinime yüklemeyi başardım, ancak yıl ve tarih klasörü oluşturamıyorum. Bunun için herhangi bir wp işlevi var ??

Yanıtlar:


27

Bu sadece media_sideload_image () ile yapılamaz mı?

Oldukça basit görünüyor. Yalnızca catch, yönetici alanında değilseniz, WordPress içerisindeki bazı kütüphaneleri içermelidir:

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

1
Bu çözüm bir cazibe gibi çalışıyor (y)
Omar Tariq

Bu kodu nereye ekleyebilirim?
16:51

1
WordPress 4.8 itibariyle Eğer dördüncü parametreyi ayarlayabilirsiniz media_sideload_imageiçin 'id've yeni eki id dönersiniz. Örn:$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

Bir yol ve posta kimliği kullanarak yükleme ile ilgili bu açıklamayı deneyin .

Kod (eski için):

/* 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

Lütfen öne çıkan resmi programlı olarak belirleyen aşağıdaki koda bakın. 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 );

}
}

0

Belki de yanlış anlıyorum, ama bunu neden WordPress ortamının dışında yapmak istesin? Bu işlevselliği çoğaltmak çok iş olurdu! WordPress, dosyayı yüklemek ve belirli bir dizine yerleştirmekten çok daha fazlasını yapar; örneğin, hangi kullanıcıların dosya yüklemesine izin verildiğini kontrol etmek, yüklemeler için veritabanı kayıtları eklemek ve özellikli görüntü ilişkileri kurmak, harici eklentiler için eylemler ve filtreler uygulamak dosya yükleme - tümü site ayarlarına bağlı kalırken (adlandırma kuralları, medya yükleme konumu vb. ile ilgili olarak).

WordPress yönetici bölümünde oturum açmadan dosyaları karşıya yüklemek istiyorsanız, örneğin harici bir siteden dosya yüklemek için XML-RPC API'sine ve özellikle uploadFileyönteme göz atmak isteyebilirsiniz .

Başka bir seçenek de kendiniz bir mini API yazmak olabilir. Temel olarak yapmak istediğiniz şey şudur:

  1. Dosyayı yükleme yoluyla sunucuya alın (veya sunucunun belirtilen bir URL'den indirmesini sağlayın).
  2. Kullanım wp_upload_dir()yükleme dizin yolunu almak ve sanitize_file_name()yol oluşturmak ve elde edilen konuma dosyayı yazmak için.
  3. wp_insert_attachment()Eki veritabanında saklamak için kullanın ( wp_check_filetype()ayar için yardımcı olacaktır post_mime_type). İsteğe bağlı olarak ayarlayın post_parentve isterseniz _thumbnail_idmeta anahtarı.
  4. API'nizi harici kullanıcılara gösterin veya gerektiğinde oturum açmanız gerekir. Herkese açık bir form kullanırsanız wp_create_nonce()ve wp_verify_nonce()formu biraz daha güvenli hale getirmek için kullanın .

bir uygulama için bir web hizmeti yazıyorum. Uygulama bana sonrası veri ve görüntü eklemek istiyorum bir dosya dizisi göndermek veritabanına yazı ayrıntıları ekledim ama görüntü bölümüne sıkışmış.
Faisal Shehzad

Belgelere bakın wp_insert_attachment(), bence ihtiyacınız olanı çok yapmalı. Yaptığınız şey buysa, WordPress dışında veritabanını el ile değiştirmekten kesinlikle vazgeçireceğim. Bunun yerine, WordPress kaynağına bakın ve gönderi verisi eklemek, dosya yüklemelerini işlemek ve ekleri eklemekle sorumlu parçaları tanımlamaya çalışın. Başka bir deyişle, yukarıdaki cevabımda özetlediğim şey.
Simon

@Simon Aynı sorunum var. Yüklemek isteyebileceğiniz diğer bir neden, farklı yayınlara eklemek istediğiniz ve toplu olarak elle yapmak istemediğiniz görüntülerin toplu işine sahip olmanızdır.
hitautodestruct

1
@hitautodestruct: Kesinlikle, genellikle varolan sitelerden, eski sistemlerden, veritabanı dışa aktarmalardan vb. verileri taşırken bunu yapmak için her zaman WordPress temel işlevlerinden yararlanmak için çaba göstermelisiniz. görüntüleri doğru yere yerleştirir.
Simon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.