web-dev-qa-db-fra.com

change set_post_thumbnail_size en fonction de la page d'administration de type post

J'ai quelques tailles de vignettes personnalisées et, évidemment, l'une d'elles est utilisée dans set_post_thumbnail_size, ce qui affecte directement l'interface dans la zone d'administration.

Ce que je cherche à faire, c’est d’intercepter la page d’administration (pour le post-type) dans laquelle je me trouve et de définir une taille différente dans la fonction ci-dessus, aussi j'aimerais-t-il avoir ceci:

function setup_the_theme() {

    add_theme_support( 'post-thumbnails' );

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

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

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

Je soupçonne qu’il est trop tôt dans le cycle pour savoir quel type de publication je suis en train d’éditer.

6
Amit

Un moyen plus simple de déterminer le type de publication de l'élément (que vous modifiez) et de télécharger le média sur:

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

Comme il a été noté, l'iframe de téléchargement de média affiché dans la superposition de la lightbox lorsque vous essayez de télécharger quelque chose n'indique pas la publication parente à laquelle ce nouveau téléchargement sera attaché. Mais le $_REQUEST est toujours actif à partir de la fenêtre d'édition et contient toujours le post_id de l'élément que vous modifiez. Il vous suffit donc de rechercher le type correspondant à cet identifiant ...

Vous pouvez utiliser cette technique dans divers crochets et filtres - j'ai déjà utilisé le filtre intermediate_image_sizes pour le traitement d'images, mais pas pour ce problème particulier, mais cela devrait également fonctionner là-bas ...

10
somatic

Il existe un filtre intermediate_image_sizes dans la fonction wp_generate_attachment_metadata . Le problème est qu'il n'a pas le type de message passé dans le cadre du contexte. Voici un moyen de résoudre ce problème en définissant un transitoire avec la valeur du type de publication dans la fenêtre contextuelle de téléchargement de média:

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;

}

Je pense que cela devrait faire l'affaire, bien qu'il existe probablement un moyen plus élégant de le faire que de définir un transitoire (et comme il est, ce n'est pas pare-balles - deux téléchargements d'images simultanés courent le risque de faire passer leurs types de publications et les images téléchargées. via le panneau "Nouveau support" peut hériter du type de message de la dernière image téléchargée sur l'écran du message.

Peut-être que quelqu'un peut améliorer cela?

Modifier:

Je savais qu'il devait y avoir une meilleure façon de faire cela. Ignorez la fonction accrochée à admin_head-media-upload-popup et suivez la réponse de @somatic pour vérifier le type de publication. Vous pouvez toujours définir la taille de la post-vignette en fonction du type de post dans intermediate_image_sizes_advanced.

7
goldenapples

J'ai mélangé les idées de Somatic et Goldenapples (merci les gens!) De la manière suivante. Cela fonctionne comme un charme et est très simple à mettre en œuvre.

Il devrait être écrit dans functions.php

/* Adding image sizes*/
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;
}
4
TheTrueTDF

Au cas où vous ne sauriez pas comment mettre en œuvre l'excellente idée de @ somatic, voici comment procéder.

Le code irait dans functions.php de votre thème:

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

    // Other theme defaults and register functions

    add_theme_support( 'post-thumbnails' );

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

        /*
         * Check if post type is 'book'. If yes, set the thumbnail size to
         * 300 x 150. If not, obey the sizes defined for thumbnail in
         * WordPress Dashboard > Media > Image sizes > Thumbnail size.
         */
        if( get_post_type( 'book' == $_REQUEST[ 'post_id' ] ) ) {
          set_post_thumbnail_size( 300, 150, false );
        }

      }

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

Ensuite, pour afficher l'image sélectionnée dans votre modèle, vous pouvez faire quelque chose comme ceci:

<?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' ) );

    }

  }

?>

Comme je le vois, vous ne pouvez pas utiliser la fonction the_post_thumbnail() habituelle, car elle affiche toujours la taille de l'image définie dans WordPress Dashboard > Media > Taille de l'image > Taille de la vignette et non la taille de l'image conditionnelle définie précédemment pour le type de publication personnalisé.

0
its_me

Je répète une réponse précédente à une question similaire :

Il n’existe aucun moyen de baser les tailles d’image sur le type de publication, car les images ne sont pas encore attachées à une publication lorsque vous les téléchargez et que les tailles intermédiaires sont créées (lorsque vous les ajoutez simplement via "New Media", elles ne sont même pas jointes). à tout poste).

Cependant, cette réponse contient des informations sur les plugins que j'ai écrits qui ensemble peuvent probablement faire ce que vous voulez: utilisez plusieurs tailles d'image, mais créez uniquement les images que vous utilisez réellement.

0
Jan Fabry