Schimbă set_post_thumbnail_size în funcție de tipul de post în pagina de administrare
Am câteva dimensiuni personalizate pentru thumbnail-uri și, evident, una dintre ele este utilizată în set_post_thumbnail_size, ceea ce afectează direct interfața în zona de administrare.
Ceea ce încerc să fac este să interceptez în care pagină de administrare (pentru un anumit tip de post) mă aflu și să setez o dimensiune diferită în funcția menționată mai sus. Practic, aș dori să obțin următoarea funcționalitate:
function setup_the_theme() {
add_theme_support( 'post-thumbnails' );
if ($post_type == 'type_A'){
set_post_thumbnail_size( 298, 167, true ); //portret
} else {
set_post_thumbnail_size( 192, 108, true ); //peisaj
}
add_image_size( 'top_articles', 298, 167, true ); //portret
add_image_size( 'article_thumb', 203, 114, true ); //portret
add_image_size( 'featured_articles', 60, 200, true ); //peisaj
}
add_action( 'after_setup_theme', 'setup_the_theme' );
Bănuiesc că este prea devreme în ciclu pentru a ști ce tip de post editez.

O metodă mai simplă de a determina tipul de postare al elementului (pe care îl editezi) și de a încărca media:
$type = get_post_type($_REQUEST['post_id']);
După cum s-a menționat, iframe-ul pentru încărcarea media care este afișat în overlayerul lightbox când încerci să încarci ceva nu indică postarea părinte la care noul fișier încărcat va fi atașat. Dar $_REQUEST
este încă activ din fereastra de editare și încă conține post_id-ul elementului pe care îl editezi - așa că pur și simplu interoghează tipul pentru acel id...
Poți folosi această tehnică în diverse hook-uri și filtre - am folosit filtrul intermediate_image_sizes
pentru procesarea imaginilor înainte, dar nu pentru această problemă specifică, dar ar trebui să funcționeze și acolo...

Nu cred că funcționează... Filtrul intermediate_image_sizes este apelat în async-upload.php, care nu este încărcat cu parametrii $_REQUEST... de aceea a trebuit să-i verific mai devreme și să găsesc undeva să salvez valoarea în exemplul meu.

Există un filtru intermediate_image_sizes
în funcția wp_generate_attachment_metadata. Problema este că nu este transmis tipul de postare ca parte a contextului. Iată o modalitate de a ocoli această problemă, prin setarea unui transient cu valoarea tipului de postare în popup-ul de încărcare 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;
}
Cred că aceasta ar trebui să funcționeze, deși probabil există o modalitate mai elegantă de a face acest lucru decât setarea unui transient (și așa cum este, nu este infailibilă - două încărcări simultane de imagini riscă să aibă tipurile de postare încrucișate, iar imaginile încărcate prin panoul "Media nou" pot moșteni tipul de postare de la ultima imagine încărcată pe ecranul de postare.
Poate cineva poate îmbunătăți acest lucru?
Edit:
Știam că trebuie să existe o modalitate mai bună de a face acest lucru. Ignorați funcția atașată la admin_head-media-upload-popup
și urmați răspunsul lui @somatic pentru verificarea tipului de postare. Puteți totuși seta dimensiunea post-thumbnail în funcție de tipul de postare în intermediate_image_sizes_advanced
.

Am combinat ideile lui Somatic și Goldenapples (mulțumesc tuturor!) în felul următor. Funcționează perfect și este foarte simplu de implementat.
Codul ar trebui scris în functions.php
/* Adăugarea dimensiunilor imaginilor */
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;
}

Deci dacă încarci o imagine direct din zona de media, aceasta va genera doar dimensiunile implicite, dar dacă încarci media în vizualizarea de editare a postării, sau schimbi, sau adaugi o imagine, aceasta va fi generată în toate formatele pentru acel tip specific de postare? Este corect?

Voi repeta un răspuns anterior la o întrebare similară:
Nu există nicio modalitate de a baza dimensiunile imaginilor pe tipul de postare, deoarece imaginile nu sunt încă atașate unei postări atunci când le încărcați și se creează dimensiunile intermediare ale imaginilor (când le adăugați prin "Media nouă", ele nu sunt nici măcar atașate vreunei postări).
Cu toate acestea, acel răspuns conține informații despre plugin-urile pe care le-am scris care împreună pot face probabil ceea ce doriți: să utilizați mai multe dimensiuni de imagini, dar să creați doar imaginile pe care le folosiți de fapt.

În caz că nu știi cum să implementezi excelenta idee a lui @somatic, iată cum poți face acest lucru.
Codul ar trebui să fie adăugat în functions.php al temei tale:
if ( ! function_exists( 'wpse6103_setup' ) )
{
function wpse6103_setup() {
// Alte setări implicite ale temei și funcții de înregistrare
add_theme_support( 'post-thumbnails' );
/*
* Bazat pe: http://wordpress.stackexchange.com/a/6123
*/
if( ! empty( $_REQUEST[ 'post_id' ] ) && ctype_digit( $_REQUEST[ 'post_id' ] ) ) {
/*
* Verifică dacă tipul postului este 'book'. Dacă da, setează dimensiunea thumbnail-ului la
* 300 x 150. Dacă nu, respectă dimensiunile definite pentru thumbnail în
* WordPress Dashboard > Media > Dimensiuni imagine > Dimensiune thumbnail.
*/
if( get_post_type( 'book' == $_REQUEST[ 'post_id' ] ) ) {
set_post_thumbnail_size( 300, 150, false );
}
}
}
}
add_action( 'after_setup_theme', 'wpse6103_setup' );
Apoi, pentru a afișa imaginea reprezentativă în template-ul tău, poți face ceva de genul:
<?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' ) );
}
}
?>
După cum văd, nu poți folosi funcția obișnuită the_post_thumbnail()
deoarece va afișa întotdeauna dimensiunea imaginii setată în WordPress Dashboard > Media > Dimensiuni imagine > Dimensiune thumbnail și nu dimensiunea condiționată pe care am setat-o mai devreme pentru tipul de postare personalizat.
