如何使用XMLRPC在WordPress中创建带有照片的新帖子?
任何人都知道如何使用XMLRPC在WordPress中创建带有照片的新帖子吗?
我能够创建新帖子并分别上传新图片,但是看起来无法将上传的照片附加到创建的帖子上吗?
I am able to create new post and upload new picture separately, but looks like there is no way to attach the uploaded photo to the created post?
下面是我当前正在使用的代码.
Below is the codes I'm currently using.
<?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 )
}
?>
我参与了WordPress网站(我的现任雇主使用了其中的3个网站),并且每天都在发布内容,这迫使我不得不使用我做的事情最好的脚本!
I've been involved in WordPress sites (my current employer uses 3 of these) and posting stuff daily and by the bulk has forced me to use what I do best-- scripts!
它们基于PHP,并且快速,易于使用和部署.和安全性?只需使用.htaccess对其进行保护即可.
They're PHP-based and are quick and easy to use and deploy. And security? Just use .htaccess to secure it.
根据研究,当涉及到文件时,XMLRPC是wordpress真正吸引的一件事.上传文件后,您将无法将该附件与特定帖子关联!我知道,这很烦人.
As per research, XMLRPC when it comes to files is one thing wordpress really sucks at. Once you upload a file, you can't associate that attachment to a particular post! I know, it's annoying.
所以我决定自己解决这个问题.我花了一个星期的时间来解决问题.您将需要100%控制符合XMLRPC的发布客户端,否则这对您没有任何意义!
So I decided to figure it out for myself. It took me a week to sort it out. You will need 100% control over your publishing client that is XMLRPC compliant or this won't mean anything to you!
您将需要在WordPress安装中
You will need, from your WordPress installation:
- class-IXR.php,位于/wp-admin/includes 位于/wp-includes中的
- class-wp-xmlrpc-server.php
- class-IXR.php, located in /wp-admin/includes
- class-wp-xmlrpc-server.php, located in /wp-includes
class-IXR.php.它们具有可以正常工作的base64编码器.不要相信PHP附带的那个.
class-IXR.php will be needed if you craft your own posting tool, like me. They have the correctly-working base64 encoder. Don't trust the one that comes with PHP.
您还需要具备一定的编程经验,以便能够与此相关.我会尝试变得更加清晰.
You also need to be somewhat experienced in programming to be able to relate to this. I will try to be clearer.
-
修改class-wp-xmlrpc-server.php
Modify class-wp-xmlrpc-server.php
- 通过ftp将其下载到您的计算机.备份副本,以防万一.
- 在文本编辑器中打开文件.如果没有格式化,(通常应该格式化,否则,就是他们正在使用的Unix类型的换行符)在其他地方打开它或使用诸如ultraedit之类的东西.
- 请注意
mw_newMediaObject
功能.这是我们的目标.这里有一点笔记; WordPress借鉴了Blogger和movabletype的功能.尽管WordPress也为xmlrpc提供了独特的类集,但他们选择保持功能通用,以便无论使用哪种平台都可以正常工作. - 查找功能
mw_newMediaObject($args)
.通常,它应该在2948行中.请注意文本编辑器的状态栏,以查找您所在的行号.如果仍然找不到行号,请使用文本编辑器的搜索/查找功能进行查找. /li> -
向下滚动一点,您应该看到类似以下内容的
- Download this to your computer, through ftp. Backup a copy, just in case.
- Open the file in a text editor. If it doesn't come formatted, (typically it should, else, it's unix-type carriage breaks they are using) open it elsewhere or use something like ultraedit.
- Pay attention to the
mw_newMediaObject
function. This is our target. A little note here; WordPress borrows functionality from blogger and movabletype. Although WordPress also has a unique class sets for xmlrpc, they choose to keep functionality common so that they work no matter what platform is in use. - Look for the function
mw_newMediaObject($args)
. Typically, this should be in line 2948. Pay attention to your text editor's status bar to find what line number you are in. If you can't find it still, look for it using the search/find function of your text editor. Scroll down a little and you should have something that looks like this:
$name = sanitize_file_name( $data['name'] );
$type = $data['type'];
$bits = $data['bits'];
在$ name变量之后,我们将添加一些内容.见下文.
After the $name variable, we will add something. See below.
$name = sanitize_file_name( $data['name'] );
$post = $data['post']; //the post ID to attach to.
$type = $data['type'];
$bits = $data['bits'];
注意新的$ post变量.这意味着每当您提出一个新的文件上传请求时,便可以附加一个"post"参数.
Note the new $post variable. This means whenever you will make a new file upload request, a 'post' argument will now be available for you to attach.
如何查找您的帖子编号取决于您如何使用兼容xmlrpc的客户端添加帖子.通常,您应该通过发布获得此结果.这是一个数值.
How to find your post number depends on how you add posts with an xmlrpc-compliant client. Typically, you should obtain this as a result from posting. It is a numeric value.
编辑完上面的内容后,该进入第3000行了.
Once you've edited the above, it's time to move on to line 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' ]
);
所以这就是为什么没有图像与任何帖子相关联的原因! post_parent参数始终默认为0! 情况将不再如此.
So here's why no image is associated to any post! It is always defaulted to 0 for the post_parent argument! That's not gonna be the case anymore.
// 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现在占用$ post的值,该值来自xmlrpc请求.一旦将其提交给附件,它将与您想要的任何帖子相关联!
$post_id now takes up the value of $post, which comes from the xmlrpc request. Once this is committed to the attachment, it will be associated to whatever post you desire!
这可以改善.可以分配一个默认值,以便在不输入任何值的情况下不会出错.尽管在我这边,我还是将默认值放在了客户端上,只有我可以访问XMLRPC接口.
This can be improved. A default value can be assigned so things don't get broken if no value is entered. Although in my side, I put the default value on my client, and no one else is accessing the XMLRPC interface but me.
完成更改后,保存文件,然后将其重新上传到找到该文件的相同路径.同样,请确保进行备份.
With the changes done, save your file and re-upload it in the same path where you found it. Again, make sure to make backups.
请注意会影响此模块的WordPress更新.如果发生这种情况,您需要再次重新应用此修改!
Be wary of WordPress updates that affects this module. If that happens, you need to reapply this edit again!
在您的PHP类型编辑器中包含class-IXR.php.如果您还使用其他工具,那我无能为力. :(
Include class-IXR.php in your PHP-type editor. If you're using something else, well, I can't help you there. :(
希望这对某些人有帮助.
Hope this helps some people.