Como definir a imagem em destaque para postagem personalizada de fora programaticamente

12

Eu estou tentando buscar e inserir imagens fora do ambiente wordpress para uma postagem personalizada via PHP.

Como mover / fazer o upload dessa imagem para o formato de pasta de data de ano do Wordpress, como o WordPress, e definir essa imagem para a imagem em destaque em relação à postagem personalizada?

Também para enviar uma imagem para a galeria de postagens personalizadas?

Abaixo está o meu código

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

Eu consegui enviar a imagem para o meu diretório de uploads, mas não consegui criar a pasta de ano e data. isso ai alguma função wp pra isso ??

    
por Faisal Shehzad 27.05.2013 / 09:21

4 respostas

23

Isso não pode ser feito simplesmente com media_sideload_image () ?

Parece bem simples. Apenas pegar é se você não estiver na área de administração, você deve incluir algumas bibliotecas de dentro do WordPress inclui:

// 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;
            }
        }
    }
}
    
por GhostToast 29.08.2013 / 21:33
1

Tente esta explicação de upload usando um caminho e postar ID .

Este é o código (para legado):

/* 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;
}
    
por hitautodestruct 20.06.2013 / 12:45
1

Por favor, consulte o seguinte código que define a imagem em destaque por meio de programação. enlace

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

}
}
    
por Liz Eipe C 06.08.2017 / 01:26
0

Talvez eu seja mal-entendido, mas por que você quer fazer isso fora do ambiente do WordPress? Replicar essa funcionalidade seria muito trabalho! O WordPress faz muito mais do que simplesmente carregar o arquivo e colocá-lo em um diretório específico, por exemplo, controlar quais usuários têm permissão para fazer upload de arquivos, adicionar registros de banco de dados para uploads e configurar relacionamentos de imagens em destaque, executar ações e filtros para plug-ins externos upload de arquivos - tudo ao mesmo tempo aderindo às configurações do site (no que diz respeito às convenções de nomenclatura, localização de upload de mídia, etc).

Se você simplesmente procura fazer upload de arquivos sem estar logado na seção de administração do WordPress, por exemplo, para fazer o upload de arquivos de um site externo, você pode querer dar uma olhada no API XML-RPC e especificamente o método uploadFile .

Outra opção poderia ser escrever uma mini API você mesmo. Basicamente, o que você gostaria de fazer é isto:

  1. Obtenha o arquivo no servidor por meio de upload (ou obtenha o servidor para fazer o download de um URL especificado).
  2. Use wp_upload_dir() para obter o caminho do diretório de upload e sanitize_file_name() para construir o caminho e gravar o arquivo no local resultante.
  3. Use wp_insert_attachment() para armazenar o anexo no banco de dados ( wp_check_filetype() será útil para definir post_mime_type ). Opcionalmente, também defina post_parent e a chave meta _thumbnail_id , se desejar.
  4. Exponha sua API a usuários externos ou solicite login, conforme necessário. Se você usar um formulário público no mínimo, use wp_create_nonce() e wp_verify_nonce() para tornar o formulário um pouco mais seguro.
por Simon 27.05.2013 / 10:47