Modificare set_post_thumbnail_size in base al tipo di post nella pagina di amministrazione
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.

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ì...

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.

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
.

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

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?

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.

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.
