Як встановити образне зображення для користувацької публікації ззовні програмно


13

Я намагаюся отримати та вставити зображення поза середовищем Wordpress у користувацький пост через PHP.

Як перемістити / завантажити це зображення у формат папки з датою року в каталозі завантаження Wordpress так само, як це зробити Wordpress, і встановити це зображення на зображене зображення проти користувацької публікації?

Також для завантаження зображення у власну галерею публікацій?

Нижче мій код

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

мені вдалося завантажити зображення в свою каталог завантажень, але не можу створити папку року та дати. це там яка-небудь функція WP для нього ??

Відповіді:


27

Це не можна зробити просто за допомогою media_sideload_image () ?

Здається, досить просто. Єдина уловка, якщо ви не в області адміністратора, ви повинні включити деякі бібліотеки з WordPress:

// 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
Це рішення працює як принадність (y)
Омар Тарік

Де я можу додати цей код?
er.irfankhan11

1
На WordPress 4.8 ви можете встановити четвертий параметр в media_sideload_imageдо 'id'і він буде повертати новий ідентифікатор вкладення. Напр .:$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); }
Дон Вілсон

1

Спробуйте це пояснення щодо завантаження за допомогою ідентифікатора шляху та публікації .

Ось код (для спадщини):

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

Будь ласка, зверніться до наступного коду, який встановив зображення зображеного програмно. http://www.pearlbells.co.uk/code-snippets/set-featured-image-wordpress-programmatic/

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

Можливо, я нерозумію, але чому б ви хотіли це робити поза середовищем WordPress? Повторити цю функціональність було б багато роботи! WordPress робить набагато більше, ніж просто завантажувати файл і розміщувати його у певній папці, наприклад, контролювати, яким користувачам дозволено завантажувати файли, додаючи записи баз даних для завантажень та налаштовуючи пропоновані взаємозв'язки зображень, виконуючи дії та фільтри для зовнішніх плагінів залежно від завантаження файлів - все, дотримуючись налаштувань сайту (що стосується іменування конвенцій, місця завантаження медіа тощо).

Якщо ви просто прагнете завантажувати файли, не входячи в розділ адміністратора WordPress, наприклад, для завантаження файлів із зовнішнього сайту, можливо, ви хочете ознайомитися з API XML-RPC та конкретно uploadFileметодом.

Іншим варіантом може бути написання міні-API самостійно. В основному, ви хотіли б це зробити:

  1. Отримайте файл на сервері за допомогою завантаження (або змусивши сервер завантажити його з вказаної URL-адреси).
  2. Використовуйте wp_upload_dir()для отримання шляху sanitize_file_name()до каталогу завантаження та для побудови шляху та записуйте файл до отриманого місця.
  3. Використовуйте wp_insert_attachment()для зберігання вкладення в базі даних ( wp_check_filetype()буде корисно для налаштування post_mime_type). За бажанням також встановіть post_parentі _thumbnail_idмета-клавішу, якщо хочете.
  4. Розмістіть свій API зовнішнім користувачам або за потреби ввійдіть у систему. Якщо ви використовуєте загальнодоступну форму як мінімум, wp_create_nonce()а wp_verify_nonce()також зробити форму трохи більш захищеною.

я пишу веб-службу для заявки. Додаток надішле мені FILE-масив, через який я хочу вставити дані публікації та зображення. Я вставив деталі публікації в базу даних, але застряг у частині зображення.
Файсал Шехзад

Перевірте документацію на те wp_insert_attachment(), вона повинна робити все те, що вам потрібно, я думаю. Я б дуже не рекомендував вручну змінювати базу даних поза WordPress, якщо це те, що ви робите. Натомість просто подивіться на джерело WordPress та спробуйте визначити частини, відповідальні за додавання публікаційних даних, обробку завантажень файлів та вставлення вкладених файлів. Іншими словами, майже все, що я окреслив у своїй відповіді вище.
Саймон

@Simon У мене те саме питання. Ще одна причина, яку ви можете завантажити, це те, що у вас є пакетне завдання зображень, які ви хочете долучити до різних публікацій, а не робити це вручну.
hitautodestruct

1
@hitautodestruct: Безумовно, я часто це роблю під час міграції даних із існуючих сайтів, застарілих систем, експорту баз даних і т. д. Моя думка, ви завжди повинні прагнути скористатися основними функціональними можливостями WordPress, щоб досягти цього, а не просто писати сценарій свого власний, який розміщує зображення в правильному місці (що до певної міри було те, про що я сприймав).
Саймон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.