Error PHP fatal: Llamada a función indefinida download_url() en WordPress

20 may 2011, 17:33:40
Vistas: 14.1K
Votos: 5

Primero, aquí está el error completo:

PHP Fatal error:  Call to undefined function download_url() in /path/to/wordpress/wp-admin/includes/media.php on line 562

También he publicado las funciones relacionadas al final de mi pregunta.

Estoy modificando un script para el sitio web de mi empresa que nos permite automatizar la obtención y carga de contenido de nuestro proveedor de contenidos. Debido a cómo organizan su XML, necesito subir las imágenes relacionadas con los artículos por separado del cuerpo principal de los artículos. Intenté usar media_sideload_image() para hacer esto, pero recibí el error:

La función (media_sideload_image()) que llama a download_url y produce el error:

PHP Fatal error:  Call to undefined function download_url() in /path/to/wordpress/wp-admin/includes/media.php on line 562

Como se puede ver, incluí correctamente media.php - y el resto de mi script ya se ha implementado en el sitio, y no he tenido otros problemas para acceder a los archivos de WordPress. El error parece estar en el propio media.php - lo cual me parece extraño.

¿Alguna idea sobre cómo puedo resolver este problema? Alternativamente, si conoces otra función que pueda usar para hacer esto, también sería apreciado.

Por supuesto, si necesitas más detalles sobre el problema, solo pregunta.

/**
 * Descarga una imagen desde la URL especificada y la adjunta a una publicación.
 *
 * @since 2.6.0
 *
 * @param string $file La URL de la imagen a descargar
 * @param int $post_id El ID de la publicación con la que se asociará el medio
 * @param string $desc Opcional. Descripción de la imagen
 * @return string|WP_Error Etiqueta HTML img poblada en caso de éxito
 */
function media_sideload_image($file, $post_id, $desc = null) {
    if ( ! empty($file) ) {
        // Descargar archivo a ubicación temporal
        $tmp = download_url( $file );

        // Establecer variables para almacenamiento
        // corregir nombre de archivo para cadenas de consulta
        preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
        $file_array['name'] = basename($matches[0]);
        $file_array['tmp_name'] = $tmp;

        // Si hay error al almacenar temporalmente, eliminar
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // hacer la validación y almacenamiento
        $id = media_handle_sideload( $file_array, $post_id, $desc );
        // Si hay error al almacenar permanentemente, eliminar
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
            return $id;
        }

        $src = wp_get_attachment_url( $id );
    }

    // Finalmente verificar que el archivo se haya guardado, luego retornar el html
    if ( ! empty($src) ) {
        $alt = isset($desc) ? esc_attr($desc) : '';
        $html = "<img src='$src' alt='$alt' />";
        return $html;
    }
}

La función donde llamo a media_sideload_image() en mi código:

//Subir la imagen si existe, y retornar el post_id
function upload_image($post_id, $image_url) {
    require_once('wp-admin/includes/media.php');
    $image_url = 'http://admin.gkbusiness.com/gkbusiness/files/2011/04/LOGOGKMBUS1.jpg';
    media_sideload_image($image_url, $post_id);
    return $post_id;
}
0
Todas las respuestas a la pregunta 3
0

También debes incluir el archivo /path/to/wordpress/wp-admin/includes/file.php, ya que media.php utiliza la función download_url() de ese archivo.

20 may 2011 17:39:05
0

¿Qué tal esto?:

function attach_image_url($file, $post_id, $desc = null) {
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    if ( ! empty($file) ) {
        // Descargar archivo a ubicación temporal
        $tmp = download_url( $file );
        // Establecer variables para almacenamiento
        // corregir nombre de archivo para cadenas de consulta
        preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
        $file_array['name'] = basename($matches[0]);
        $file_array['tmp_name'] = $tmp;
        // Si hay error al almacenar temporalmente, eliminar
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }
        // hacer la validación y proceso de almacenamiento
        $id = media_handle_sideload( $file_array, $post_id, $desc );
        // Si hay error al almacenar permanentemente, eliminar
        if ( is_wp_error($id) ) {@unlink($file_array['tmp_name']);}
        add_post_meta($post_id, '_thumbnail_id', $id, true);
    }
}
7 mar 2012 17:28:47
1

Si no necesitas una solución tan detallada o tienes problemas con otras funcionalidades que faltan en tu script 'externo', simplemente incluye también los scripts de administración.

Así que en la parte superior de tu script 'externo' que debería usar la funcionalidad de WordPress, incluye wp-load para las funcionalidades del frontend y admin.php para las funcionalidades del backend/administración:

require_once ('wp-load.php');
require_once ('wp-admin/includes/admin.php');

Esto asume que tu script está en el nivel raíz de WordPress, si no es así tendrás que adaptar las rutas.

5 sept 2016 17:21:02
Comentarios

include(ABSPATH . "wp-admin/includes/admin.php"); ahorró mucho juego del gato y el ratón en comparación con rastrear todos los archivos necesarios. Simplemente envuélvelo dentro de un bloque if (!is_admin()) dentro de tu función y estarás listo.

Kaji Kaji
9 may 2017 09:08:32