Modificare set_post_thumbnail_size in base al tipo di post nella pagina di amministrazione

29 dic 2010, 23:35:28
Visualizzazioni: 6.3K
Voti: 7

Ho diverse dimensioni personalizzate per le anteprime e ovviamente una di queste viene utilizzata in set_post_thumbnail_size, il che influisce direttamente sull'interfaccia nell'area di amministrazione.

Quello che voglio fare è intercettare in quale pagina di amministrazione (per tipo di post) mi trovo e impostare una dimensione diversa nella funzione sopra, quindi fondamentalmente vorrei ottenere questo:

function setup_the_theme() {

    add_theme_support( 'post-thumbnails' );

        if ($post_type == 'type_A'){
            set_post_thumbnail_size( 298, 167, true ); //ritratto
        } else {
            set_post_thumbnail_size( 192, 108, true ); //paesaggio
        }

    add_image_size( 'top_articles', 298, 167, true ); //ritratto
    add_image_size( 'article_thumb', 203, 114, true ); //ritratto
    add_image_size( 'featured_articles', 60, 200, true ); //paesaggio

}
add_action( 'after_setup_theme', 'setup_the_theme' );

Sospetto che sia troppo presto nel ciclo per sapere quale tipo di post sto modificando.

2
Commenti

Puoi modificare la tua domanda per descrivere il tuo obiettivo finale? Quello che stai chiedendo sembra un'idea di implementazione, piuttosto che un risultato finale. Potrebbe esserci un modo per ottenere quello che vuoi, senza modificare set_post_thumbnail_size().

Chip Bennett Chip Bennett
20 ott 2013 18:01:14

@ChipBennett domanda piuttosto vecchia, penso che probabilmente vorrei un'immagine in evidenza personalizzata per tipo di post nell'area di amministrazione durante la modifica di un custom_post_type. Forse qualcosa come set_post_thumbnail_size(larghezza, altezza, ritaglio, post_type)..

Amit Amit
20 nov 2013 03:15:25
Tutte le risposte alla domanda 5
2
11

Modo più semplice per identificare il tipo di post dell'elemento (che stai modificando) e per caricare i media:

$type = get_post_type($_REQUEST['post_id']);

Come è stato notato, l'iframe di caricamento dei media che viene mostrato nell'overlay della lightbox quando provi a caricare qualcosa non indica il post genitore a cui il nuovo upload sarà allegato. Ma la variabile $_REQUEST è ancora attiva dalla finestra di modifica e contiene ancora il post_id dell'elemento che stai modificando - quindi basta interrogare il tipo per quell'id...

Puoi utilizzare questa tecnica in vari hook e filtri - ho usato il filtro intermediate_image_sizes per l'elaborazione delle immagini in precedenza, ma non per questo problema specifico, però dovrebbe funzionare anche lì...

30 dic 2010 06:25:14
Commenti

Non penso che funzioni... Il filtro intermediate_image_sizes viene chiamato in async-upload.php, che non viene caricato con i parametri $_REQUEST... ecco perché ho dovuto verificarli prima e trovare un posto dove salvare il valore nel mio esempio.

goldenapples goldenapples
30 dic 2010 07:46:28

In realtà hai ragione. È lì. Molto astuto... Avevo controllato i parametri GET prima ma non mi sono fermato a pensare che potessero essere inviati via POST.

goldenapples goldenapples
30 dic 2010 19:47:53
0

C'è un filtro intermediate_image_sizes nella funzione wp_generate_attachment_metadata. Il problema è che non viene passato il post type come parte del contesto. Ecco un modo per aggirare questo problema, impostando un transient con il valore del post type nel popup di upload media:

add_action( 'admin_head-media-upload-popup', 'define_post_type' );

function define_post_type() {
    $referring_string = explode('?',$_SERVER['HTTP_REFERER']);
    if ($referring_string[1]) parse_str( $referring_string[1] );
    else $post_type = 'post';
    set_transient('current_upload_parent_type',$post_type);
}

add_filter( 'intermediate_image_sizes_advanced', 
     'set_thumbnail_size_by_post_type', 10);

function set_thumbnail_size_by_post_type( $sizes ) {

    $post_type = get_transient( 'current_upload_parent_type' );
    delete_transient( 'current_upload_parent_type' );

    switch ($post_type) :
        case 'type_A' :
            $sizes['post-thumbnail'] = array( 
                         'width' => 298, 'height' => 167, 'crop' => true);
            break;
        default :
            $sizes['post-thumbnail'] = array( 
                         'width' => 192, 'height' => 108, 'crop' => true);
            break;
    endswitch;

    return $sizes;

}

Penso che questo dovrebbe funzionare, anche se probabilmente esiste un modo più elegante per farlo rispetto all'impostazione di un transient (e così com'è, non è infallibile - due upload simultanei di immagini rischiano di incrociare i loro post type, e le immagini caricate tramite il pannello "Nuovo Media" potrebbero ereditare il post type dall'ultima immagine caricata nella schermata di post.

Forse qualcuno può migliorare questo codice?

Modifica:

Sapevo che doveva esserci un modo migliore per farlo. Ignora la funzione agganciata a admin_head-media-upload-popup e segui la risposta di @somatic per verificare il post type. Puoi comunque impostare la dimensione della post-thumbnail in base al post type in intermediate_image_sizes_advanced.

30 dic 2010 00:54:04
2

Ho combinato le idee di Somatic e Goldenapples (grazie ragazzi!) nel modo seguente. Funziona perfettamente ed è molto semplice da implementare.

Il codice dovrebbe essere scritto nel file functions.php

/* Aggiunta dimensioni immagini */
add_filter( 'intermediate_image_sizes_advanced', 'set_thumbnail_size_by_post_type', 10 );
function set_thumbnail_size_by_post_type( $sizes ) {

    $post_type = get_post_type( $_REQUEST['post_id'] );

    switch ( $post_type ) :
        case 'service' :
            $sizes['service'] = array( 
                'width' => 250,
                'height' => 155,
                'crop' => true
            );    
        break;
        case 'post' :
            $sizes['post'] = array( 
                'width' => 250,
                'height' => 210,
                'crop' => true
            );
        break;
        default :
            $sizes['default'] = array( 
                'width' => 200,
                'height' => 200,
                'crop' => true
            );
    endswitch;

    return $sizes;
}
22 ott 2015 09:35:01
Commenti

Quindi, se carichi un'immagine direttamente dall'area media, verranno generate solo le dimensioni predefinite, ma se carichi i media dalla vista di modifica del post, o cambi, o aggiungi un'immagine, verrà generata in tutti i formati per quel tipo di post specifico? È corretto?

Luca Reghellin Luca Reghellin
15 ago 2017 14:46:18

Devi caricare i media mentre sei nella pagina di modifica del post. Cambiare l'immagine e salvarla nuovamente non sembra generare le dimensioni attese.

TheTrueTDF TheTrueTDF
16 ago 2017 04:32:17
0

Ripeterò una risposta precedente a una domanda simile:

Non esiste un modo per basare le dimensioni delle immagini sul tipo di post, poiché le immagini non sono ancora associate a un post quando le carichi e vengono create le dimensioni intermedie delle immagini (quando le aggiungi tramite "Nuovo Media" non sono nemmeno associate a nessun post).

Tuttavia, quella risposta contiene informazioni su plugin che ho scritto che insieme probabilmente possono fare ciò che desideri: utilizzare più dimensioni di immagine, ma creare solo le immagini che effettivamente usi.

29 dic 2010 23:49:18
0

Nel caso in cui non sappiate come implementare l'ottima idea di @somatic, ecco come fare.

Il codice andrebbe inserito nel functions.php del vostro tema:

if ( ! function_exists( 'wpse6103_setup' ) )
{
  function wpse6103_setup() {

    // Altri valori predefiniti del tema e funzioni di registrazione

    add_theme_support( 'post-thumbnails' );

      /*
       * Basato su: http://wordpress.stackexchange.com/a/6123
       */
      if( ! empty( $_REQUEST[ 'post_id' ] ) && ctype_digit( $_REQUEST[ 'post_id' ] ) ) {

        /*
         * Verifica se il tipo di post è 'book'. Se sì, imposta la dimensione della miniatura a
         * 300 x 150. Altrimenti, rispetta le dimensioni definite per le miniature in
         * WordPress Dashboard > Media > Dimensioni immagini > Dimensione miniatura.
         */
        if( get_post_type( 'book' == $_REQUEST[ 'post_id' ] ) ) {
          set_post_thumbnail_size( 300, 150, false );
        }

      }

  }
}
add_action( 'after_setup_theme', 'wpse6103_setup' );

Per visualizzare l'immagine in evidenza nel vostro template, potete fare qualcosa del genere:

<?php

  if ( has_post_thumbnail() ) {

    if( 'aahank_book' == get_post_type() ) {

      echo wp_get_attachment_image( get_post_thumbnail_id( $post->ID ), array( 300, 150 ), false, array( 'class' => 'img-thumbnail' ) );

    } else {

      the_post_thumbnail( 'thumbnail', array( 'class' => 'img-thumbnail' ) );

    }

  }

?>

Come vedo, non potete utilizzare la solita funzione the_post_thumbnail() perché mostrerà sempre la dimensione dell'immagine impostata in WordPress Dashboard > Media > Dimensioni immagini > Dimensione miniatura e non la dimensione condizionale che abbiamo impostato in precedenza per il custom post type.

20 ott 2013 17:58:34