Réécrire une fonction principale?

4

Si je comprends bien, il est possible d’écraser des fonctions essentielles dans Wordpress, sans toucher au cœur même, ce qui présente un avantage évident.

Maintenant, certaines fonctions sont "connectables", mais pas toutes.

J'essaie d'écraser la fonction qui permet d'afficher la taille personnalisée de la vignette de l'image sélectionnée dans le panneau d'administration. Ce n'est pas vraiment difficile de le faire dans le noyau. Le problème se pose lorsque je tente de le placer dans mon fichier functions.php en tant que fonction renommée.

Il s’agit de la fonction principale, modifiée. Ce que je ferais serait juste de le renommer et de le mettre dans functions.php, mais comment puis-je le faire écraser la fonction «principale» elle-même?

function _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {
    global $content_width, $_wp_additional_image_sizes;

    $post = get_post( $post );

    $upload_iframe_src = esc_url( get_upload_iframe_src('image', $post->ID ) );
    $set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set featured image' ) . '" href="%s" id="set-post-thumbnail" class="thickbox">%s</a></p>';
    $content = sprintf( $set_thumbnail_link, $upload_iframe_src, esc_html__( 'Set featured image' ) );

    if ( $thumbnail_id && get_post( $thumbnail_id ) ) {
        $old_content_width = $content_width;
        $content_width = 700;
        if ( !isset( $_wp_additional_image_sizes['post-thumbnail'] ) )
            $thumbnail_html = wp_get_attachment_image( $thumbnail_id, array( $content_width, $content_width ) );
        else
            $thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'post-thumbnail' );
        if ( !empty( $thumbnail_html ) ) {
            $ajax_nonce = wp_create_nonce( 'set_post_thumbnail-' . $post->ID );
            $content = sprintf( $set_thumbnail_link, $upload_iframe_src, $thumbnail_html );
            $content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail" onclick="WPRemoveThumbnail(\'' . $ajax_nonce . '\');return false;">' . esc_html__( 'Remove featured image' ) . '</a></p>';
        }
        $content_width = $old_content_width;
    }

    return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID );
}
    
posée andy 19.07.2013 - 06:18

2 réponses

3

Vous n'avez pas besoin de remplacer une fonction principale pour cela, vous devez simplement vous connecter au filtre admin_post_thumbnail_html .

add_filter('admin_post_thumbnail_html', 'wpse107096_wp_post_thumbnail_html',10, 2);

function wpse107096_wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {
    global $content_width, $_wp_additional_image_sizes;

    $post = get_post( $post );

    $upload_iframe_src = esc_url( get_upload_iframe_src('image', $post->ID ) );
    $set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set featured image' ) . '" href="%s" id="set-post-thumbnail" class="thickbox">%s</a></p>';
    $content = sprintf( $set_thumbnail_link, $upload_iframe_src, esc_html__( 'Set featured image' ) );

    if ( $thumbnail_id && get_post( $thumbnail_id ) ) {
        $old_content_width = $content_width;
        $content_width = 700;
        if ( !isset( $_wp_additional_image_sizes['post-thumbnail'] ) )
            $thumbnail_html = wp_get_attachment_image( $thumbnail_id, array( $content_width, $content_width ) );
        else
            $thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'post-thumbnail' );
        if ( !empty( $thumbnail_html ) ) {
            $ajax_nonce = wp_create_nonce( 'set_post_thumbnail-' . $post->ID );
            $content = sprintf( $set_thumbnail_link, $upload_iframe_src, $thumbnail_html );
            $content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail" onclick="WPRemoveThumbnail(\'' . $ajax_nonce . '\');return false;">' . esc_html__( 'Remove featured image' ) . '</a></p>';
        }
        $content_width = $old_content_width;
    }

    return $content;
}

Oui, vous perdrez des cycles de calcul à cause des calculs répétés, mais c’est la bonne façon de le faire. Si cela vous dérange, vous devriez rechercher un moyen plus intelligent de définir la taille de contenu requise.

    
réponse donnée Mark Kaplun 19.07.2013 - 09:19
2

Seules les fonctions définies comme "pouvant être connectées" peuvent être remplacées dans un plugin / un thème.

Mais ... Vous ne devriez pas avoir besoin de réécrire une fonction principale pour redimensionner les images présentées. Voir à la place set_post_thumbnail_size() (et, plus généralement, add_image_size() ).

    
réponse donnée Pat J 19.07.2013 - 06:25

Lire d'autres questions sur les étiquettes