Wordpress XML-RPC, аттачменты - Форум успешных вебмастеров - GoFuckBiz.com
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB93.4409
BTC/USD64124.0864
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 19.12.2011, 12:39   #1
somebody_
Senior Member
 
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
Отправить сообщение для somebody_ с помощью Telegram
По умолчанию Wordpress XML-RPC, аттачменты

Сила гоуфака помоги .... пишу скриптег который по xml-rpc будет закидывать в удаленные блоги новости и т.д. Вроде все хорошо закидывается, аттачменты добавляются. НО проблема что аттачменты не имеют парента, они как бы заливаются в вордпресс, но не закрепленны за отдельным постом. Уже затыркал гугол, не получается Пробовал wp.uploadFile и metaWeblog.newMediaObject ... аттачмент добавляется но не закрепляется за постом.
__________________
Пилю под Wordpress на php, html5, css3, jquery, since 2008 - wpmastering.pro
somebody_ вне форума  
Старый 19.12.2011, 12:51   #2
tooltip
Вставлю сюда ваша рекламу
 
Регистрация: 18.12.2011
Адрес: 443 порт
Сообщений: 40
Бабло: $6430
Отправить сообщение для tooltip с помощью ICQ
По умолчанию

wp.uploadFile просто ссылается на metaWeblog.newMediaObject

Для привязки аттача к посту, нужно еще указать post_parent, а судя по коду вордпресса, он всегда равен 0
tooltip вне форума  
Старый 19.12.2011, 14:19   #3
somebody_
Senior Member
 
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
ТС -->
Отправить сообщение для somebody_ с помощью Telegram
автор темы ТС По умолчанию

Спасибо больше за наводку ... пашел копать class-wp-xmlrpc-server.php а там блять
Цитата:
// Construct the attachment array
// attach to post_id 0
$post_id =0;
ну вот нах они так сделали ? ... пришлось чуток дапилить ...

теперь встала задача ... дописать старый свой скрипт(это када я незнал про xml-rpc) или каждый раз допиливать ....
__________________
Пилю под Wordpress на php, html5, css3, jquery, since 2008 - wpmastering.pro
somebody_ вне форума  
Старый 19.12.2011, 14:35   #4
tooltip
Вставлю сюда ваша рекламу
 
Регистрация: 18.12.2011
Адрес: 443 порт
Сообщений: 40
Бабло: $6430
Отправить сообщение для tooltip с помощью ICQ
По умолчанию

Самый правильный вариант - разобраться почему так сделано.

Изначально видно, что все аттачи будут неприкрепленными.
Следовательно - крепить их не здесь, ищем в коде и находим функцию


PHP код:
    /**
     * Attach upload to a post.
     *
     * @since 2.1.0
     *
     * @param int $post_ID Post ID.
     * @param string $post_content Post Content for attachment.
     */
    
function attach_uploads$post_ID$post_content ) {
        global 
$wpdb;

        
// find any unattached files
        
$attachments $wpdb->get_results"SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'" );
        if ( 
is_array$attachments ) ) {
            foreach ( 
$attachments as $file ) {
                if ( 
strpos$post_content$file->guid ) !== false )
                    
$wpdb->update($wpdb->posts, array('post_parent' => $post_ID), array('ID' => $file->ID) );
            }
        }
    } 
Но ее нет в списках доступных методов.
Она вызывается только при создании или редактировании постов. Так что, видимо нужно еще один запрос посылать, чтобы прикрепить аттач. Хрень конечно, но что поделать.


Если блоги сугубо свои - то проще сделать свой пропатченный архив вордпресса и ставить его везде.
tooltip вне форума  
Старый 19.12.2011, 15:06   #5
somebody_
Senior Member
 
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
ТС -->
Отправить сообщение для somebody_ с помощью Telegram
автор темы ТС По умолчанию

Цитата:
Но ее нет в списках доступных методов.
Она вызывается только при создании или редактировании постов. Так что, видимо нужно еще один запрос посылать, чтобы прикрепить аттач. Хрень конечно, но что поделать.
как же сделать еще запрос что б использовать эту функцию ?
__________________
Пилю под Wordpress на php, html5, css3, jquery, since 2008 - wpmastering.pro
somebody_ вне форума  
Старый 19.12.2011, 15:31   #6
vilnus
Member
 
Регистрация: 12.02.2010
Сообщений: 41
Бабло: $7055
По умолчанию

Цитата:
Сообщение от somebody_ Посмотреть сообщение
как же сделать еще запрос что б использовать эту функцию ?
Ну там же, в xmlrpc
PHP код:
class wp_xmlrpc_server extends IXR_Server {
    function 
wp_xmlrpc_server() {
        
$this->methods = array(
            
// WordPress API
            
'wp.getPage'            => 'this:wp_getPage',
            
'wp.getPages'            => 'this:wp_getPages',
            
'wp.newPage'            => 'this:wp_newPage',
.... 
Добавляешь свой метод, допустим, "somebody.attachFile", делаешь функцию somebody_attachFile(), и там же в коде ее реализовываешь по аналогии с остальными. Там не сложно.

Ну и вызывать тебе ее тоже, соответственно, придется из своей штуки-публикатора. Весь готовый софт про такую функцию ничего не знает и пользоваться ей не будет.

Имхо намного проще похакать код и заменить $post_id = 0; на что тебе надо, тогда все стандартные клиенты будут работать как работали, просто аттачи будут вставляться куда надо. И ничего не придется допиливать.

Иногда грязные хаки намного лучше правильных решений.
vilnus вне форума  
Старый 19.12.2011, 15:49   #7
tooltip
Вставлю сюда ваша рекламу
 
Регистрация: 18.12.2011
Адрес: 443 порт
Сообщений: 40
Бабло: $6430
Отправить сообщение для tooltip с помощью ICQ
По умолчанию

Патчить код в движке - рационально, если используешь свою сборку движка, где уже все готово и настроено.

Если у тебя уже есть парк стандартных админок - то патчить, лишь себе вредить. Нет гарантии того, что при очередном обновлении - не затрется твой код, тем более еще и не сразу заметишь потом такой косяк.

Вообщем, как нужно сделать правильно:
1) Создаем аттач

PHP код:
function upload($blogUrl$username$password) {
    
$blog = new wp_blog($blogUrl.'xmlrpc.php'$username$password0);
    
$res $blog->uploadFile('face.png''/tmp/face.png''image/png'true);
    
print_r($res);

Нам выдаст такой ответ

Цитата:
Array
(
[file] => face.png
[url] => http://example.com/face.png
[type] => image/png
)

Берем отсюда урл аттача
http://example.com/face.png

2) Теперь создаем новый пост или редактируем существующий

PHP код:
$poster wp_poster::getInstance();
$blog = new wp_blog($blogUrl.'xmlrpc.php'$username$password0);
    
$post = new wp_post();
$post->setTitle('title');
$post->setDescription('А тут мы вставляем любой контент и картинку аттача <img src="http://example.com/face.png">');
...
$r $poster->post($blog$post); 

А работает все так:
Как только, в тексте поста обнаружится ссылка на ничейный аттачмент - то сразу, этот аттач прикрепится к этому посту.
tooltip вне форума  
Старый 19.12.2011, 16:13   #8
somebody_
Senior Member
 
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
ТС -->
Отправить сообщение для somebody_ с помощью Telegram
автор темы ТС По умолчанию

+100500 за столь полный ответ ....
Цитата:
Добавляешь свой метод, допустим, "somebody.attachFile", делаешь функцию somebody_attachFile(), и там же в коде ее реализовываешь по аналогии с остальными. Там не сложно.
да про это я понял ... я думал может в вордпрессе уже есть готовый метод чтоб связать аттачмент с постом ...

А теперь ...
Цитата:
2) Теперь создаем новый пост или редактируем существующий
не прокатит ... как как тамбнейлы к постам генерятся из аттачментов. Такой вариант я в одном месте использую ...
Цитата:
Имхо намного проще похакать код и заменить $post_id = 0; на что тебе надо
вот так и сделал ...
Цитата:
Нет гарантии того, что при очередном обновлении - не затрется твой код, тем более еще и не сразу заметишь потом такой косяк.
и есть самое важное ... так уже было 1 раз у меня ... устал искать где проблема

Скорее всего свой паблишер допишу ... который будет подключаться в удаленному серверу и с него забирать все что нужно ... а потом грамотно складывать в ворд пресс ... Просто я оставил эту идею када узнал про xml-rpc ... но че то имхо там не все доконца реализованно ...
__________________
Пилю под Wordpress на php, html5, css3, jquery, since 2008 - wpmastering.pro
somebody_ вне форума  
Старый 19.12.2011, 18:59   #9
arma
Пионер
 
Аватар для arma
 
Регистрация: 21.12.2007
Сообщений: 197
Бабло: $37745
По умолчанию

В свое время копался с этим.

Там баг был в xmlrpc, который гуглится.
__________________
arma вне форума  
Старый 20.12.2011, 11:15   #10
vojager
Member
 
Аватар для vojager
 
Регистрация: 10.09.2008
Сообщений: 71
Бабло: $22694
По умолчанию

Цитата:
Сообщение от tooltip Посмотреть сообщение
wp.uploadFile просто ссылается на metaWeblog.newMediaObject

Для привязки аттача к посту, нужно еще указать post_parent, а судя по коду вордпресса, он всегда равен 0
а с чего вы решили, что он всегда равен нулю? в metaWeblog.newMediaObject есть все для передачи данного параметра

PHP код:
        // Construct the attachment array
        // attach to post_id 0
        
$post_id 0;

        
$attachment = array(
            
'post_title' => $name,
            
'post_content' => '',
            
'post_type' => 'attachment',
            [
B]'post_parent' => $post_id,[/B]
            
'post_mime_type' => $type,
            
'guid' => $upload'url' ]
        ); 
передается все это в такой конструкции
Цитата:
<param><value><struct><member><name>post_title</name><value><string>ИМЯ_Файла</string></value></member><member><name>post_content</name><value>Файл</value></member><member><name>post_type</name><value><string>attachment</string></value></member><member><name>post_parent</name><value><int>Номер_Поста</int></value></member><member><name>guid</name><value><string>Upload_URL_</string></value></member></struct></value></param>
vojager вне форума