it-swarm-eu.dev

Jak WP Nahrávač médií vytvoří 3 různé velikosti obrázků a jak je mohu duplikovat

Mám konečně !! dostal jsem tuhle věc, kterou jsem zkusil asi 12 krát, a 12 různých způsobů, ale nakonec jsem to dostal do práce, ... tak nějak.

Udělal jsem vlastní metabox pro nahrávání a připojování obrázků do příspěvků a nevyžaduje, abyste používali hrozné nahrané médium, které je zabudováno do WP. Nesnáším tu věc. Ne, to, co jsem udělal, je jen skupina vstupů (název, popis, soubor), které můžete také duplikovat, chcete-li přidat další přílohy. Vyplníte tedy pole, vyberete obrázek, který chcete nahrát, a uložte návrh nebo příspěvek zveřejněte. Jakmile jsou do příspěvku přidány přílohy, metabox zobrazí vstupní pole spolu s obrázkem náhledu připojeného obrázku pro každou přidanou přílohu. Pole názvu a popisu se používají pro generování meta dat souboru, nic se neuloží jako post_meta, o kterém vím. To je v současné době vše, co jsem dosud pracoval.

Musím to udělat tak, že když uložíte/zveřejníte příspěvek, nahrajete/vytvoříte soubory příloh, vytvoří se tři velikosti obrázků jako výchozí odesílatel wp, miniatura, střední, velká a zachová se i obrázek v plné velikosti. . Pokud je to možné. Pokud ne, rád bych jinak použil add_image_size() k vytvoření/definování nových vlastních velikostí a vygeneroval je tak místo toho při nahrávání.

Nejsem si jistý, která funkce je nejvhodnější použít v tomto případě, možná image_make_intermediate_size() funkce by byla lepší, nebo wp_create_thumbnail() nebo wp_crop_image()... kdo ví!

Nemohu přijít na to, jak to udělat, když potřebuji spustit funkci wp_handle_upload() pro každou z nich, nebo něco, co by zahrnovalo funkci wp_generate_attachment_metadata(). Je to pro mě matoucí, protože 3 velikosti obrázků mají být spojeny jako varianty téže přílohy a jak to udělat.

Prohlédl jsem si web, přečetl zdroj každého wp media/upload/image souboru a hrál s téměř každou funkcí, která je pro média nahraná a nemůžu najít, jak WP vytváří 3 velikosti obrázků kdekoli, nebo jak to udělat sám.

V wp-includes/media.php vypadá funkce image_resize() jako nejlepší, protože je to přesně to, co by mělo být. Prostě nemůžu přijít na to, co mi do pekla chybí, nebo jsem se snažil dělat, ale udělal špatně, abych vytvořil miniatury.

Zde je moje pracovní funkce, která dělá wp_handle_upload() věci a věci, ale také potřebuje vytvořit 100px palec, a udělat změnu velikosti obrázku, který je max-width jako 500px, a uloženy jako nové soubory nahrané.

function update_attachment(){
  global $post;

  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );

  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $url = wp_handle_upload( $_FILES['a_image'], $override );

    // $medium = image_make_intermediate_size( $uploaded_file['url'], 500, 400, true );
    // $thumb = = image_make_intermediate_size( $uploaded_file['url'], 100, 100, true );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $array_type = wp_check_filetype
    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

    $name_parts = pathinfo( $name );
    $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] )) ));

    $type = $file['type'];
    $file = $file['file'];
    $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
    $content = $_POST['a_desc']

    $post_id = $post->ID;
    $attachment = array(
      'post_title' => $title,
      'post_type' => 'attachment',
      'post_content' => $content,
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $url['url']
    );


    // Save the data
    $id = wp_insert_attachment( $attachment, $_FILES['a_image'][ 'file' ]/*, $post_id - for post_thumbnails*/);

    if ( !is_wp_error( $id )) {
      $attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file['url'] );
      wp_update_attachment_metadata( $attach_id, $attach_meta );
    }
    update_post_meta( $post->ID, 'a_image', $uploaded_file['url'] );
  }
}

Každý, kdo by mi mohl pomoci, aby to konečně napravil, by byl milovaný. Strávil jsem tolik směšných bezpočet hodin, kolikrát jsem se snažil tuto věc rozvinout a dokumentace naštve, a na tom, jak to udělat, nejsou žádné dobré příspěvky.

Dík

16
jaredwilli

Hi @jaredwilli:

Kámo! Skvělé úsilí a pěkná práce. All-in-all to může být skvělý doplněk k WordPress.

Byli jste tak blízko, ale měli jste někde mezi 5 a 10 malými neúspěšnými předpoklady nebo kódem, který vypadá, že jste to začali, ale nevrátili se k němu, protože to nefungovalo. Přepracoval jsem vaši funkci jen tak, jak jsem potřeboval, abych to napravil. Toto řešení následuje a já nechám bok po boku srovnání s vaším nebo někým méně vyhořelým. :)

function update_attachment() {
  global $post;
  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );
  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES['a_image'], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES['a_image']['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
      $content = $_POST['a_desc'];

      $post_id = $post->ID;
      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $post_id,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $post_id - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }
      update_post_meta( $post->ID, 'a_image', $file['url'] );
    }
  }
}

Hej, proč neupadnout a dostat si kopii PhpStorm ? Mohli jste to snadno vyřešit sami, byli jste tak blízko, kdybyste mohli přesně zjistit kód, jako teď. Pokud tak učiníte, neztrácejte čas na velmi buggy XDEBUG a místo toho stáhněte Zend Debugger .

P.S. To je moje dřívější odpověď. Poslal jsem to, než jsem si uvědomil, co přesně Jared ptal. Je to správné, ale nesouvisí s jeho otázkou. :)


Myslím, že to, co hledáte, je add_image_size():

add_image_size( $size_id, $width, $height, $crop );

Například:

add_image_size('headshot', 130, 150);
add_image_size('large-headshot', 260, 300);

Nastavením této WordPress vytvoří tyto velikosti automaticky. Co to potřebujete?

6
MikeSchinkel

pokud vám rozumím, musíte nejprve dostat seznam velikostí takto:

$image_sizes = get_intermediate_image_sizes();

toto vrátí pole všech registrovaných velikostí obrázků (výchozí: velké, střední, miniaturní, libovolné vlastní velikosti registrované pomocí "add_image_size ()", pak vše, co musíte udělat, je smyčka pro každou z velikostí a vytvořit obrázek pro tuto velikost, jako je tento:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size['width'], $size['height'], $crop); 
}

pokud chcete obrázek oříznout na nové rozměry nebo hodnotu false, změňte hodnotu $ file nahranou cestou a $ crop s true nebo false.

0
Bainternet