|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 64124.0864 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
19.12.2011, 12:39
|
#1
|
Senior Member
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
|
Wordpress XML-RPC, аттачменты
Сила гоуфака помоги .... пишу скриптег который по xml-rpc будет закидывать в удаленные блоги новости и т.д. Вроде все хорошо закидывается, аттачменты добавляются. НО проблема что аттачменты не имеют парента, они как бы заливаются в вордпресс, но не закрепленны за отдельным постом. Уже затыркал гугол, не получается Пробовал wp.uploadFile и metaWeblog.newMediaObject ... аттачмент добавляется но не закрепляется за постом.
|
|
|
19.12.2011, 12:51
|
#2
|
Вставлю сюда ваша рекламу
Регистрация: 18.12.2011
Адрес: 443 порт
Сообщений: 40
Бабло: $6430
|
wp.uploadFile просто ссылается на metaWeblog.newMediaObject
Для привязки аттача к посту, нужно еще указать post_parent, а судя по коду вордпресса, он всегда равен 0
|
|
|
19.12.2011, 14:19
|
#3
|
Senior Member
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
ТС -->
|
ТС
Спасибо больше за наводку ... пашел копать class-wp-xmlrpc-server.php а там блять
Цитата:
// Construct the attachment array
// attach to post_id 0
$post_id =0;
|
ну вот нах они так сделали ? ... пришлось чуток дапилить ...
теперь встала задача ... дописать старый свой скрипт(это када я незнал про xml-rpc) или каждый раз допиливать ....
|
|
|
19.12.2011, 14:35
|
#4
|
Вставлю сюда ваша рекламу
Регистрация: 18.12.2011
Адрес: 443 порт
Сообщений: 40
Бабло: $6430
|
Самый правильный вариант - разобраться почему так сделано.
Изначально видно, что все аттачи будут неприкрепленными.
Следовательно - крепить их не здесь, ищем в коде и находим функцию
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) );
}
}
}
Но ее нет в списках доступных методов.
Она вызывается только при создании или редактировании постов. Так что, видимо нужно еще один запрос посылать, чтобы прикрепить аттач. Хрень конечно, но что поделать.
Если блоги сугубо свои - то проще сделать свой пропатченный архив вордпресса и ставить его везде.
|
|
|
19.12.2011, 15:06
|
#5
|
Senior Member
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
ТС -->
|
ТС
Цитата:
Но ее нет в списках доступных методов.
Она вызывается только при создании или редактировании постов. Так что, видимо нужно еще один запрос посылать, чтобы прикрепить аттач. Хрень конечно, но что поделать.
|
как же сделать еще запрос что б использовать эту функцию ?
|
|
|
19.12.2011, 15:31
|
#6
|
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; на что тебе надо, тогда все стандартные клиенты будут работать как работали, просто аттачи будут вставляться куда надо. И ничего не придется допиливать.
Иногда грязные хаки намного лучше правильных решений.
|
|
|
19.12.2011, 15:49
|
#7
|
Вставлю сюда ваша рекламу
Регистрация: 18.12.2011
Адрес: 443 порт
Сообщений: 40
Бабло: $6430
|
Патчить код в движке - рационально, если используешь свою сборку движка, где уже все готово и настроено.
Если у тебя уже есть парк стандартных админок - то патчить, лишь себе вредить. Нет гарантии того, что при очередном обновлении - не затрется твой код, тем более еще и не сразу заметишь потом такой косяк.
Вообщем, как нужно сделать правильно:
1) Создаем аттач
PHP код:
function upload($blogUrl, $username, $password) {
$blog = new wp_blog($blogUrl.'xmlrpc.php', $username, $password, 0);
$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, $password, 0);
$post = new wp_post();
$post->setTitle('title');
$post->setDescription('А тут мы вставляем любой контент и картинку аттача <img src="http://example.com/face.png">');
...
$r = $poster->post($blog, $post);
А работает все так:
Как только, в тексте поста обнаружится ссылка на ничейный аттачмент - то сразу, этот аттач прикрепится к этому посту.
|
|
|
19.12.2011, 16:13
|
#8
|
Senior Member
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
ТС -->
|
ТС
+100500 за столь полный ответ ....
Цитата:
Добавляешь свой метод, допустим, "somebody.attachFile", делаешь функцию somebody_attachFile(), и там же в коде ее реализовываешь по аналогии с остальными. Там не сложно.
|
да про это я понял ... я думал может в вордпрессе уже есть готовый метод чтоб связать аттачмент с постом ...
А теперь ...
Цитата:
2) Теперь создаем новый пост или редактируем существующий
|
не прокатит ... как как тамбнейлы к постам генерятся из аттачментов. Такой вариант я в одном месте использую ...
Цитата:
Имхо намного проще похакать код и заменить $post_id = 0; на что тебе надо
|
вот так и сделал ...
Цитата:
Нет гарантии того, что при очередном обновлении - не затрется твой код, тем более еще и не сразу заметишь потом такой косяк.
|
и есть самое важное ... так уже было 1 раз у меня ... устал искать где проблема
Скорее всего свой паблишер допишу ... который будет подключаться в удаленному серверу и с него забирать все что нужно ... а потом грамотно складывать в ворд пресс ... Просто я оставил эту идею када узнал про xml-rpc ... но че то имхо там не все доконца реализованно ...
|
|
|
19.12.2011, 18:59
|
#9
|
Пионер
Регистрация: 21.12.2007
Сообщений: 197
Бабло: $37745
|
В свое время копался с этим.
Там баг был в xmlrpc, который гуглится.
__________________
|
|
|
20.12.2011, 11:15
|
#10
|
Member
Регистрация: 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>
|
|
|
|
|