it-swarm-eu.dev

Stáhnout obrázek z webové stránky do výchozí složky pro odesílání

Píšu vlastní motiv/plugin, ve kterém musím stahovat obrázky programově z určitých webových stránek do složky pro upload a poté je vkládat jako součást příspěvku.

Takže jsem byl schopen najít url obrazu programaticky, a pak je třeba uložit do složky pro nahrávání pod obsahem wp, ale tato složka má konkrétní strukturu složek WordPress uvnitř uložených obrázků.

Teď je moje otázka, je tam WordPress API nebo funkce nebo metoda, která mi umožní stahovat obrázky z webu a ukládat je do složky uploadů? A pokud ano, co to je.

V opačném případě, co mám udělat, abych tyto obrázky uložil?

Zatím to dělám

$filetype = wp_check_filetype(basename($image_file_name), null );

$upload_dir = wp_upload_dir();

$attachment = array(
    'guid' => $upload_dir['url'] . '/' . basename( $image_file_name ), 
    'post_mime_type' => $filetype['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($image_file_name)),
    'post_content' => '',
    'post_status' => 'inherit'
);

$attachment_id = wp_insert_attachment( $attachment, $image_file_name, $post_id );

$attachment_data = wp_generate_attachment_metadata( $attachment_id, $image_file_name );

wp_update_attachment_metadata( $attachment_id,  $attachment_data );
set_post_thumbnail( $post_id, $attachment_id );

Ale výše uvedený kód mi dává následující chybu

imagejpeg(http://wscdn.bbc.co.uk/worldservice/assets/images/2013/07/21/130721173402_egypts_new_foreign_minister_fahmy_304x171_reuters-150x150.jpg): failed to open stream: HTTP wrapper does not support writeable connections in C:\dev\wordpress\pterodactylus\wp-includes\class-wp-image-editor.php on line 334

A po dalším vyšetřování to vypadá, že chyba je příčinou

$attachment_data = wp_generate_attachment_metadata( $attachment_id, $image_file_name );

A po ještě dalším zkoumání dokumentace pro wp_insert_attachment() uvádí, žeThe file MUST be on the uploads directorypokud jde o $image_file_name

Jak si tedy mohu stáhnout obrázek a uložit jej do svého příspěvku správně?

Díky moc.

8
Greeso

Nedávno jsem to musel udělat přes noční cron skript pro sociální media stream. $ parent_id je ID příspěvku, ke kterému chcete obrázek připojit.

function uploadRemoteImageAndAttach($image_url, $parent_id){

    $image = $image_url;

    $get = wp_remote_get( $image );

    $type = wp_remote_retrieve_header( $get, 'content-type' );

    if (!$type)
        return false;

    $mirror = wp_upload_bits( basename( $image ), '', wp_remote_retrieve_body( $get ) );

    $attachment = array(
        'post_title'=> basename( $image ),
        'post_mime_type' => $type
    );

    $attach_id = wp_insert_attachment( $attachment, $mirror['file'], $parent_id );

    require_once(ABSPATH . 'wp-admin/includes/image.php');

    $attach_data = wp_generate_attachment_metadata( $attach_id, $mirror['file'] );

    wp_update_attachment_metadata( $attach_id, $attach_data );

    return $attach_id;

}

ex:

uploadRemoteImageAndAttach('http://some-external-site.com/the-image.jpg', 122);
11
Jeffrey Barrett

Nemáte žádný vyslaný kód, který se používá pro načtení a uložení obrázku, takže není možné říci, kde je chyba.

Vyzkoušejte tento kód pro uchopení a uložení obrázku:

function my_grab_image($url = NULL, $name = NULL ) {
  $url = stripslashes($url);
  if ( ! filter_var($url, FILTER_VALIDATE_URL) ) return false;
  if ( empty($name )) $name = basename($url);
  $dir = wp_upload_dir();
  $filename = wp_unique_filename( $uploads['path'], $name, NULL );
  $filetype = wp_check_filetype($filename, NULL );
  if ( ! substr_count($filetype['type'], 'image') ) return false;
  try {
    $image = my_fetch_image($url);
    if ( ! is_string($image) || empty($image) ) return false;
    $save = file_put_contents( $dir['path'] . "/" . $filename, $image );
    if ( ! $save ) return false;
    return $dir['path'] . "/" . $filename;
  } catch ( Exception $e ) {
    // echo $e->getMessage(); // Is a good idea log this error
    return false;
  }
}

function my_fetch_image($url) {
  if ( function_exists("curl_init") ) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $image = curl_exec($ch);
    curl_close($ch);
    return $image;
  } elseif ( ini_get("allow_url_fopen") ) {
    $image = file_get_contents($url, false);
    return $image;
  } else {
    throw new Exception('curl is not available and fopen url is disallowed');
  }
}

Tyto funkce pak jednoduše použijte v kombinaci s kódem:

$image_file_name =  @my_grab_image('http://this.is.the.image.url/image.jpg');
if ( $image_file_name && file_exists($image_file_name) ) {
  // PUT HERE YOUR CODE
}

Nezapomeňte také, že must chcete-li do svého kódu funkce wp_generate_attachment_metadata() zahrnout wp-admin/includes/image.php, podívejte se na Codex

Doufám, že tato pomoc, ale prosím, uvědomte si, že celý kód zde je ne testován.

1
gmazzap

Stačí použít výchozí funkci wp (v2.6.0 +):

media_sideload_image ($ file, $ post_id, $ desc, $ return);

0
fdrv

Tuto funkci můžete použít k dálkovému nahrání obrázku do složky s nahranými soubory a nastavit jej jako zobrazený obrázek.

function set_remote_featured_image($file, $post_id) {
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // Set variables for storage
        // fix file filename for query strings
        preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
        $file_array['name'] = basename($matches[0]);
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // do the validation and storage stuff
        $id = media_handle_sideload( $file_array, $post_id, $desc );
        // If error storing permanently, unlink
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
            return $id;
        }

        set_post_thumbnail( $post_id, $id );
    }
}

Používání:

set_remote_featured_image("http://example.com/image.jpg", 1);
0
shankshera