it-swarm.com.de

Benutzerdefiniertes Feld in Empfohlenes Bild für einen bestimmten Beitrag

Ich habe meinem vorgestellten Bild ein benutzerdefiniertes Textfeld hinzugefügt, um es mit dem folgenden Code zu veröffentlichen.

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

Es funktioniert gut!!! Dieser Code zeigt den zusätzlichen Textbereich nur im POST an. Aber wenn ich ein ausgewähltes Bild else Teil ausgewählt habe, wird ausgeführt (nur das ausgewählte Bild wird zurückgegeben). Wenn Sie ein Bild hinzufügen, enthält $pagenowadmin-ajax.php und get_post_type() ist null. globale Variablen $post erzeugt einen Nullwert. Was sollte ich jetzt tun?

4
Prifulnath

Beachten Sie, dass für den admin_post_thumbnail_html filter-Rückruf zusätzliche Eingabeargumente verfügbar sind, nämlich $post->ID und $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 );

das wird innerhalb der _wp_post_thumbnail_html() -Funktion angewendet.

Hier ist ein Beispiel, wie Sie den globalen Beitrag in Ihrem Snippet vermeiden können, indem Sie stattdessen das Eingabeargument $post->ID verwenden:

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

Wenn Sie diese Filterung wirklich auf die Bildschirme post.php und post-new.php und den Ajax-Aufruf get-post-thumbnail-html beschränken müssen, können Sie eine Prüfung wie die folgende hinzufügen:

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

aber dann nehme ich an, du bist z. Aufruf der "privaten" Kernfunktion _wp_post_thumbnail_html() woanders? Diese ( unterstrichenen ) privaten Funktionen sind jedoch nicht für die Verwendung durch Plugin- und Theme-Entwickler vorgesehen, sondern nur für andere Kernfunktionen .

4
birgire