Cómo crear nuevos post con la foto adjunta en WordPress utilizando XMLRPC?

Alguien sabe cómo crear nuevos post con la foto adjunta en WordPress utilizando XMLRPC?

Soy capaz de crear nuevos post y subir una nueva imagen por separado, pero parece que no hay manera de adjuntar la foto subida a la publicación creada?

A continuación es el de los códigos que estoy utilizando actualmente.

<?php
DEFINE('WP_XMLRPC_URL', 'http://www.blog.com/xmlrpc.php');
DEFINE('WP_USERNAME', 'username');
DEFINE('WP_PASSWORD', 'password');

require_once("./IXR_Library.php");
$rpc = new IXR_Client(WP_XMLRPC_URL);
$status = $rpc->query("system.listMethods"); //method name
if(!$status){
    print "Error (".$rpc->getErrorCode().") : ";
    print $rpc->getErrorMessage()."\n";
    exit;
}

$content['post_type'] = 'post'; //post title
$content['title'] = 'Post Title '.date("F j, Y, g:i a"); //post title
$content['categories'] = array($response[1]['categoryName']); //psot categories
$content['description'] = '<p>Hello World!</p>'; //post body
$content['mt_keywords'] = 'tag keyword 1, tag keyword 2, tag keyword 3'; //post tags
$content['mt_allow_comments'] = 1; //allow comments
$content['mt_allow_pings'] = 1; //allow pings
$content['custom_fields'] = array(array('key'=>'Key Name', 'value'=>'Value One')); //custom fields
$publishBool = true;

if(!$rpc->query('metaWeblog.newPost', '', WP_USERNAME, WP_PASSWORD, $content, $publishBool)){
    die('An error occurred - '.$rpc->getErrorCode().":".$rpc->getErrorMessage());
}
$postID = $rpc->getResponse();
echo 'POST ID: '.$postID.'<br/>';

if($postID){ //if post has successfully created

    $fs = filesize(dirname(__FILE__).'/image.jpg');
    $file = fopen(dirname(__FILE__).'/image.jpg', 'rb');
    $filedata = fread($file, $fs);
    fclose($file);

    $data = array(
        'name'  => 'image.jpg',
        'type'  => 'image/jpg',
        'bits'  => new IXR_Base64($filedata),
        false //overwrite
    );

    $status = $rpc->query(
        'metaWeblog.newMediaObject',
        $postID,
        WP_USERNAME,
        WP_PASSWORD,
        $data
    );
    echo print_r($rpc->getResponse()); //Array ( [file] => image.jpg [url] => http://www.blog.com/wp-content/uploads/2011/09/image.jpg [type] => image/jpg )
}
?>

OriginalEl autor P.C. | 2011-09-30

6 Kommentare

  1. 9

    He estado involucrado en sitios WordPress (mi actual empleador utiliza 3 de estos) y la publicación de cosas a diario y por la mayor parte me ha obligado a usar lo que mejor hago– scripts!

    Que está basado en PHP y son rápidos y fáciles de usar y de implementar. Y la seguridad? Sólo uso .htaccess para asegurarlo.

    Según la investigación, XMLRPC cuando se trata de archivos es una cosa de wordpress que realmente apesta. Una vez que subas un archivo, no se puede asociar el archivo adjunto a un mensaje particular! Sé que es molesto.

    Así que me decidí a averiguar por mí mismo. Me tomó una semana para arreglarlo. Usted tendrá 100% de control sobre su publicación cliente XMLRPC cumple o no significa nada para usted!

    Tendrá, a partir de su instalación de WordPress:

    • class-IXR.php, que se encuentra en /wp-admin/includes
    • class-wp-xmlrpc-server.php, que se encuentra en /wp-includes

    class-IXR.php será necesario si desea crear su propia publicación de la herramienta, como yo. Tienen la forma correcta de trabajar en base64 encoder. No confían el uno que viene con PHP.

    También tendrá que ser con algo de experiencia en programación para ser capaz de relacionarse con este. Trataré de ser más clara.

    1. Modificar class-wp-xmlrpc-server.php

      • Descargar este a su ordenador, a través de ftp. Copia de seguridad una copia, por si acaso.
      • Abrir el archivo en un editor de texto. Si no vienen formateados, (normalmente se debe, de lo contrario, es unix-tipo de carro se rompe están utilizando) abrir en otro lugar o usar algo como ultraedit.
      • Prestar atención a la mw_newMediaObject función. Este es nuestro objetivo. Una pequeña nota aquí; WordPress toma prestado de la funcionalidad de blogger y movabletype. Aunque WordPress también tiene una única clase de juegos para la xmlrpc, que decide mantener la funcionalidad común a fin de que funcionen independientemente de la plataforma está en uso.
      • Busque la función mw_newMediaObject($args). Normalmente, este debe estar en línea 2948. Preste atención a su editor de texto de la barra de estado para encontrar lo que el número de línea en la que están. Si usted no puede encontrar todavía, mira que a través de la búsqueda/buscar función de su editor de texto.
      • Desplácese hacia abajo un poco y usted debe tener algo que se parece a esto:

         $name = sanitize_file_name( $data['name'] );
         $type = $data['type'];
         $bits = $data['bits'];
      • Después de que la variable $name, vamos a añadir algo. Ver a continuación.

         $name = sanitize_file_name( $data['name'] );
         $post = $data['post']; //the post ID to attach to.
         $type = $data['type'];
         $bits = $data['bits'];

        Nota el nuevo $variable post. Esto significa que cada vez que va a hacer un nuevo archivo de solicitud de carga, un ‘post’ argumento ahora estará disponible para usted para fijar.

        Cómo encontrar el número del puesto depende de cómo agregar entradas con un xmlrpc-cliente compatible. Normalmente, usted debe obtener esta como resultado de la publicación. Es un valor numérico.

        Una vez que haya terminado de editar el anterior, es el momento de pasar a la línea de 3000.

        //Construct the attachment array
        //attach to post_id 0
        $post_id = 0;
        $attachment = array(
            'post_title' => $name,
            'post_content' => '',
            'post_type' => 'attachment',
            'post_parent' => $post_id,
            'post_mime_type' => $type,
            'guid' => $upload[ 'url' ]
        );
      • Así que he aquí por qué no hay ninguna imagen asociada a cualquier post!!! Siempre es de pago a 0 para el post_parent argumento!
        Que no va a ser el caso más.

        //Construct the attachment array
        //attach to post_id 0
        $post_id = $post;
        $attachment = array(
            'post_title' => $name,
            'post_content' => '',
            'post_type' => 'attachment',
            'post_parent' => $post_id,
            'post_mime_type' => $type,
            'guid' => $upload[ 'url' ]
        );

        $post_id ahora toma el valor de $post, que viene de la xmlrpc solicitud. Una vez que esto se ha comprometido a la fijación, de ser asociado a cualquier post te deseo!

        Esto puede ser mejorado. Un valor por defecto puede ser asignado de manera de que las cosas no se rompen si no se escribió ningún valor. Aunque en mi lado, me puso el valor predeterminado en mi cliente, y de nadie más, es el acceso a la XMLRPC interfaz, pero me.

      • Con los cambios, guarde el archivo y volver a subir el archivo en la misma ruta donde se encuentra. De nuevo, asegúrese de hacer copias de seguridad.

        Desconfíe de las actualizaciones de WordPress que afecta a este módulo. Si eso sucede, usted necesita volver a aplicar esta edición de nuevo!

    2. Incluyen class-IXR.php en su tipo PHP editor. Si usted está usando algo más, bueno, yo puedo ayudarte. 🙁

    Espero que esto ayuda a algunas personas.

    Hacking archivos del núcleo nunca es aconsejable, y hoy en día es posible lograr la solución sin hacks.

    OriginalEl autor O_H

  2. 3

    Al post, WordPress va a escanear en el post de las etiquetas IMG.
    Si WP encuentra la imagen, es cargado en la biblioteca de medios. Si hay una imagen en el cuerpo, se adjunta automáticamente al correo.

    Básicamente, usted tiene que:

    • post de los medios de comunicación (imagen) en el primer
    • Agarrar su URL
    • incluir la URL de la imagen con una etiqueta IMG en el cuerpo de tu post.
    • a continuación, crear el post

    Aquí está el código de ejemplo. Se necesita el manejo de errores, y algunos más documentación.

    $admin ="***";
    $userid ="****";
    $xmlrpc = 'http://localhost/web/blog/xmlrpc.php';
    include '../blog/wp-includes/class-IXR.php';
    $client = new IXR_Client($xmlrpc);
    
    $author         =   "test";    
    $title          =   "Test Posting";
    $categories     =   "chess,coolbeans";
    $body           =   "This is only a test disregard </br>";
    
    $tempImagesfolder = "tempImages";
    $img = "1338494719chessBoard.jpg";
    
    
    $attachImage = uploadImage($tempImagesfolder,$img);
    $body .= "<img src='$attachImage' width='256' height='256' /></a>";
    
    createPost($title,$body,$categories,$author);
    
    /*
    */
    function createPost($title,$body,$categories,$author){
        global $username, $password,$client;
        $authorID =  findAuthor($author); //lookup id of author
    
        /*$categories is a list seperated by ,*/
        $cats = preg_split('/,/', $categories, -1, PREG_SPLIT_NO_EMPTY);
        foreach ($cats as $key => $data){
            createCategory($data,"","");
        }
    
        //$time = time();
        //$time += 86400;
        $data = array(
            'title' => $title,
            'description' => $body,
            'dateCreated' => (new IXR_Date(time())),
            //'dateCreated' => (new IXR_Date($time)),  //publish in the future
            'mt_allow_comments' => 0, //1 to allow comments
            'mt_allow_pings' => 0,//1 to allow trackbacks
            'categories' => $cats,
            'wp_author_id' => $authorID     //id of the author if set       
        );
        $published = 0; //0 - draft, 1 - published
        $res = $client->query('metaWeblog.newPost', '', $username, $password, $data, $published);
    }
    
    /*
    */
    function uploadImage($tempImagesfolder,$img){
        global $username, $password,$client;
        $filename = $tempImagesfolder ."/" . $img;
    
        $fs = filesize($filename);   
        $file = fopen($filename, 'rb');  
        $filedata = fread($file, $fs);    
        fclose($file); 
    
        $data = array(
            'name'  => $img, 
            'type'  => 'image/jpg',  
            'bits'  => new IXR_Base64($filedata), 
            false //overwrite
        );
    
        $res = $client->query('wp.uploadFile',1,$username, $password,$data);
        $returnInfo = $client->getResponse();
    
        return $returnInfo['url'];     //return the url of the posted Image
    }
    
    /*
    */
    function findAuthor($author){
        global $username, $password,$client;
        $client->query('wp.getAuthors ', 0, $username, $password);
        $authors = $client->getResponse();
        foreach ($authors as $key => $data){
            // echo $authors[$key]['user_login'] . $authors[$key]['user_id'] ."</br>";
            if($authors[$key]['user_login'] == $author){
                return $authors[$key]['user_id'];
            }
        }
        return "not found";
    }
    
    /*
    */
    function createCategory($catName,$catSlug,$catDescription){
        global $username, $password,$client;
        $res = $client->query('wp.newCategory', '', $username, $password,
            array(
                'name' => $catName,
                'slug' => $catSlug,
                'parent_id' => 0,
                'description' => $catDescription
            )
        );
    }

    OriginalEl autor subterfuge

  3. 1

    Después de llamar al método metaWeblog.newMediaObject, tenemos que editar la imagen de entrada en la base de datos para agregar un padre (el creado anteriormente post con metaWeblog.newPost).

    Si tratamos con metaWeblog.editPost, se produce un error 401, lo que indica que

    //Use wp.editPost to edit post types other than post and page.
    if ( ! in_array( $postdata[ 'post_type' ], array( 'post', 'page' ) ) )
        return new IXR_Error( 401, __( 'Invalid post type' ) );

    La solución es llamar a wp.editPost, que tiene los siguientes argumentos:

    $blog_id        = (int) $args[0];
    $username       = $args[1];
    $password       = $args[2];
    $post_id        = (int) $args[3];
    $content_struct = $args[4];

    Así, justo después de newMediaObject, hacemos:

    $status = $rpc->query(
        'metaWeblog.newMediaObject',
        $postID,
        WP_USERNAME,
        WP_PASSWORD,
        $data
    );
    $response = $rpc->getResponse();
    if( isset($response['id']) ) {
        //ATTACH IMAGE TO POST
        $image['post_parent'] = $postID;
        if( !$rpc->query('wp.editPost', '1', WP_USERNAME, WP_PASSWORD, $response['id'], $image)) {
            die( 'An error occurred - ' . $rpc->getErrorCode() . ":" . $rpc->getErrorMessage() );
        }
        echo 'image: ' . $rpc->getResponse();
    
        //SET FEATURED IMAGE
        $updatePost['custom_fields'] = array( array( 'key' => '_thumbnail_id', 'value' => $response['id'] ) );
        if( !$rpc->query( 'metaWeblog.editPost', $postID, WP_USERNAME, WP_PASSWORD, $updatePost, $publishBool ) ) {
            die( 'An error occurred - ' . $rpc->getErrorCode() . ":" . $rpc->getErrorMessage() );
        }
        echo 'update: ' . $rpc->getResponse();
    }

    he utilizado el Incutio XML-RPC Librería para PHP a prueba y el resto del código es exactamente igual que en la pregunta.

    OriginalEl autor brasofilo

  4. 1

    He aquí algunos ejemplos de código para adjuntar una imagen a partir de una ruta de acceso no es compatible con WordPress (wp-content)

    <?php
    function attach_wordpress_images($productpicture,$newid)
    {
        include('../../../../wp-load.php');
        $upload_dir = wp_upload_dir();
        $dirr = $upload_dir['path'].'/';
    
        $filename = $dirr . $productpicture;                    
        # print "the path is : $filename \n";                    
        # print "Filnamn: $filename \n";                
        $uploads = wp_upload_dir(); //Array of key => value pairs
        # echo $uploads['basedir'] . '<br />';
        $productpicture = str_replace('/uploads','',$productpicture);
        $localfile =  $uploads['basedir'] .'/' .$productpicture;
        #  echo "Local path = $localfile \n";         
    
        if (!file_exists($filename))
        {
            echo "hittade inte $filename !";
            die ("no image for flaska $id $newid !");                                                   
        }
        if (!copy($filename, $localfile)) 
        {
            wp_delete_post($newid);
            echo  "Failed to copy the file $filename to $localfile ";
            die("Failed to copy the file $filename to $localfile ");
        }
    
        $wp_filetype = wp_check_filetype(basename($localfile), null );
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => preg_replace('/\.[^.]+$/', '', basename($localfile)),
            'post_content' => '',
            'post_status' => 'inherit'
            );
        $attach_id = wp_insert_attachment( $attachment, $localfile, $newid );
    
        //you must first include the image.php file
        //for the function wp_generate_attachment_metadata() to work
    
        require_once(ABSPATH . 'wp-admin/includes/image.php');        
        $attach_data = wp_generate_attachment_metadata( $attach_id, $localfile );
        wp_update_attachment_metadata( $attach_id, $attach_data );  
    }
    ?>
    Lo siento. Agradezco sus códigos de ejemplo, pero estoy buscando los métodos que se realiza en XML-RPC.

    OriginalEl autor moffepoffe

  5. 0

    Tenía que hacer esto hace varios meses. Es posible pero no sólo es chapucero e indocumentados tuve que cavar a través de wordpress origen a la figura hacia fuera. Lo que escribí entonces:

    Una cosa que era absolutamente onu-documentado era un método para adjuntar una imagen a un post. Después de algo de investigación he encontrado attach_uploads() que es una función de wordpress que llama cada vez que un post es creado o editado más de xml-rpc. Lo que hace es buscar a través de la lista de la onu-conectado de objetos multimedia y ver si el nuevo/editar entrada contiene un enlace a ellos. Desde que yo estaba tratando de adjuntar imágenes, de modo que el tema de la galería de los usaría yo no necesariamente quiere enlace a las imágenes en el post, ni tampoco quiero editar wordpress. Así que lo que terminé haciendo fue incluyendo la url de la imagen en un comentario html. — danieru.com

    Como dije desordenado pero he buscado de alta y baja para un mejor método y estoy razonablemente seguro de que no existe ninguno.

    $id = media_handle_sideload( $data, $this->_post_id, $title ) + update_post_meta( $this->_post_id, '_thumbnail_id', $this->_thumb_id = $id )

    OriginalEl autor Daniel

  6. 0

    De WordPress 3.5, newmediaobject reconoce ahora el hack semi-de forma nativa.

    no es necesario hackear class-wp-xmlrpc-server.php.

    En su lugar, el xml-rpc cliente debe enviar el post número a una variable llamada post_id. (Antes era sólo la variable ‘post’)

    Espero que ayude a alguien.

    Hola, por lo que es posible hacer todo en XMLRPC sin edición de wordpress? y si sí ¿cuáles son los pasos? He hecho una nueva pregunta aquí stackoverflow.com/questions/17722743/… Gracias.

    OriginalEl autor O_H

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea