¿Reescribiendo una función central?

4

Tal como lo entiendo, es posible sobrescribir las funciones del núcleo en wordpress, sin tocar el núcleo en sí, lo cual es un beneficio obvio.

Ahora, ciertas funciones son 'conectables', pero no todas.

Estoy intentando sobrescribir la función que genera la miniatura de la imagen destacada en el panel de administración para que tenga un tamaño personalizado, no es realmente difícil hacer esto en el núcleo. El problema surge cuando trato de ponerlo en mi functions.php como una función renombrada.

Esta es la función principal, editada. Lo que haría es simplemente cambiarle el nombre y ponerlo en functions.php, pero entonces, ¿cómo puedo hacer que sobrescriba la función 'core'?

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 );
}
    
pregunta andy 19.07.2013 - 06:18

2 respuestas

3

No es necesario anular una función principal para eso, lo que debes hacer es enganchar el filtro 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;
}

sí, desperdiciarás algunos ciclos de CPU debido al cálculo repetido, pero esa es la forma correcta de hacerlo. Si le molesta, debe buscar una forma más inteligente de establecer el tamaño de contenido requerido adecuado.

    
respondido por el Mark Kaplun 19.07.2013 - 09:19
2

Solo las funciones definidas como funciones "conectables" se pueden anular en un complemento / tema.

Pero ... No debería necesitar volver a escribir una función central para cambiar el tamaño de sus imágenes destacadas. En su lugar, vea set_post_thumbnail_size() (y, más generalmente, add_image_size() ).

    
respondido por el Pat J 19.07.2013 - 06:25

Lea otras preguntas en las etiquetas