web-dev-qa-db-fra.com

Champ personnalisé dans l'image sélectionnée pour un article particulier

J'ai ajouté une zone de texte personnalisée à mon image sélectionnée uniquement pour publier, à l'aide du code suivant.

function add_featured_description( $content ) {
    global $post;
    $small_description = get_post_meta( $post->ID,'thumbnail_description', true ) !== '0' ? get_post_meta( $post->ID,'thumbnail_description', true ) : '';
    global $pagenow;
    if (is_admin() && ($pagenow == 'post-new.php' || $pagenow == 'post.php') && ( get_post_type()=='post' ) ) {
      return $content .= '<div id="thumb_desc_container">
                            <textarea name="thumbnail_description" id="thumbnail_description" rows="4" style="width:100%;">'.$small_description.'</textarea>
                            <p class="hide-if-no-js howto" id="set-post-thumbnail-desc">Enter the image description.</p>
                          </div>';
    } else{
      return $content;
    }
}
add_filter( 'admin_post_thumbnail_html', 'add_featured_description');

Ça fonctionne bien!!! Ce code affiche la zone de texte supplémentaire uniquement dans POST. Mais lorsque j'ai sélectionné une image sélectionnée, une partie else est exécutée (seule l'image sélectionnée est renvoyée). Lorsque vous ajoutez une image, $pagenow contient admin-ajax.php et get_post_type() est null. les variables globales $post produisent une valeur nulle. Qu'est-ce que je devrais faire maintenant?

4
Prifulnath

Notez qu'il existe des arguments d'entrée supplémentaires disponibles pour le rappel de filtre admin_post_thumbnail_html , à savoir $post->ID et $thumbnail_id:

/**
 * Filters the admin post thumbnail HTML markup to return.
 *
 * @since 2.9.0
 * @since 3.5.0 Added the `$post_id` parameter.
 * @since 4.6.0 Added the `$thumbnail_id` parameter.
 *
 * @param string $content      Admin post thumbnail HTML markup.
 * @param int    $post_id      Post ID.
 * @param int    $thumbnail_id Thumbnail ID.
 */
 return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID, $thumbnail_id );

qui est appliqué dans la fonction _wp_post_thumbnail_html() .

Voici un exemple pour éviter la publication globale dans votre extrait, en utilisant plutôt l'argument d'entrée $post->ID:

function wpse250432_add_featured_description( $content, $post_id, $thumbnail_id ) {

    $small_description = get_post_meta( $post_id, 'thumbnail_description', true );

    // Target only the 'post' post type
    if ( 'post' === get_post_type( $post_id ) ) 
      $content .= '<div id="thumb_desc_container">...</div>'; // Edit

    return $content;
}
add_filter( 'admin_post_thumbnail_html', 'wpse250432_add_featured_description', 10, 3 );

Si vous avez vraiment besoin de restreindre ce filtrage aux écrans post.php et post-new.php et à l'appel get-post-thumbnail-html ajax, vous pouvez ajouter une coche comme celle-ci:

if( 
       ! did_action( 'load-post.php' ) 
    && ! did_action( 'load-post-new.php' ) 
    && ! did_action( 'wp_ajax_get-post-thumbnail-html' )
)
    return $content;

mais alors je suppose que vous êtes par exemple appelez la fonction _wp_post_thumbnail_html() "privée" ailleurs? Mais ces ( underscored ) les fonctions privées ne sont pas destinées à être utilisées par les développeurs de plugins et de thèmes, mais uniquement par d’autres fonctions principales .

4
birgire