如何使用 XMLRPC 在 WordPress 中创建带有照片的新帖子?
有人知道如何使用 XMLRPC 在 WordPress 中创建带有照片的新帖子吗?
我可以单独创建新帖子并上传新图片,但看起来无法将上传的照片附加到创建的帖子中。邮政?
以下是我当前使用的代码。
<?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 )
}
?>
Anyone knows how to create new post with photo attached in WordPress using XMLRPC?
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 )
}
?>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我参与过 WordPress 网站(我现在的雇主使用其中的 3 个),每天都会发布大量内容,这迫使我使用我最擅长的东西——脚本!
它们基于 PHP,并且快速且易于使用和部署。还有安全性?只需使用 .htaccess 来保护它。
根据研究,XMLRPC 在文件方面是 WordPress 真正糟糕的一件事。上传文件后,您无法将该附件关联到特定帖子!我知道,这很烦人。
所以我决定自己想办法。我花了一周时间才整理出来。您需要对符合 XMLRPC 的发布客户端进行 100% 的控制,否则这对您来说毫无意义!
您将需要,从您的 WordPress 安装:
如果您制作,则需要 class-IXR.php你自己的发帖工具,就像我一样。他们有正确工作的 Base64 编码器。不要相信 PHP 附带的那个。
您还需要在编程方面有一定的经验才能理解这一点。我会尽力说得更清楚。
修改class-wp-xmlrpc-server.php
mw_newMediaObject
函数。这是我们的目标。这里有一点注意; WordPress 借鉴了博客和活字印刷的功能。尽管 WordPress 也有一个独特的 xmlrpc 类集,但它们选择保持通用功能,以便无论使用什么平台它们都可以工作。mw_newMediaObject($args)
。通常,这应该位于第 2948 行。请注意文本编辑器的状态栏,以查找您所在的行号。如果仍然找不到它,请使用文本编辑器的搜索/查找功能进行查找。< /里>向下滚动一点,您应该看到如下所示的内容:
在 $name 变量之后,我们将添加一些内容。见下文。
注意新的 $post 变量。这意味着每当您发出新的文件上传请求时,现在都可以附加“post”参数。
如何查找您的帖子编号取决于您如何使用符合 xmlrpc 的客户端添加帖子。通常,您应该通过发布获得此结果。它是一个数值。
编辑完上述内容后,就可以转到第 3000 行了。
这就是为什么没有图像与任何帖子关联的原因! post_parent 参数始终默认为 0!
以后情况不会再这样了。
$post_id 现在占用 $post 的值,该值来自 xmlrpc 请求。一旦将其提交到附件,它将与您想要的任何帖子相关联!
这个可以改进。可以分配默认值,这样如果没有输入值,事情就不会被破坏。虽然在我这边,我把默认值放在了我的客户端上,除了我之外没有其他人访问XMLRPC接口。
完成更改后,保存文件并将其重新上传到您找到它的同一路径中。再次强调,一定要做好备份。
警惕影响此模块的 WordPress 更新。如果发生这种情况,您需要再次重新应用此编辑!
在您的 PHP 类型编辑器中包含 class-IXR.php。如果您使用其他东西,那么我无法帮助您。 :(
希望这对某些人有帮助。
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!
They're PHP-based and are quick and easy to use and deploy. And security? Just use .htaccess to secure it.
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.
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!
You will need, from your WordPress installation:
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.
Modify class-wp-xmlrpc-server.php
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.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:
After the $name variable, we will add something. See below.
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.
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.
Once you've edited the above, it's time to move on to line 3000.
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.
$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!
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.
Be wary of WordPress updates that affects this module. If that happens, you need to reapply this edit again!
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.
当您发帖时,WordPress 会在帖子中扫描 IMG 标签。
如果 WP 找到该图像,则会将其加载到其媒体库中。如果正文中有图像,它会自动将其附加到帖子中。
基本上,您必须:
这是一些示例代码。它需要错误处理和更多文档。
When you post, WordPress will scan at the post for IMG tags.
If WP finds the image, it's loaded in it's media library. If there's an image in the body, it will automatically attached it to the post.
Basically you have to:
Here is some sample code. It needs error handling, and some more documentation.
调用方法
metaWeblog.newMediaObject
后,我们需要编辑数据库中的图像条目以添加父项(之前使用metaWeblog.newPost
创建的帖子)。如果我们尝试使用
metaWeblog.editPost
,它会抛出错误 401,这表明解决方案是调用
wp.editPost
,它采用以下参数:因此,在
newMediaObject
之后,我们执行以下操作:我使用了 Incutio用于 PHP 的 XML-RPC 库进行测试,其余代码与问题中完全相同。
After calling the method
metaWeblog.newMediaObject
, we need to edit the image entry on the database to add a parent (the previously created post withmetaWeblog.newPost
).If we try with
metaWeblog.editPost
, it throws an error 401, which indicates thatThe solution is to call
wp.editPost
, which takes the following arguments:So, just after
newMediaObject
, we do:I've used the Incutio XML-RPC Library for PHP to test and the rest of the code is exactly as in the question.
以下是一些示例代码,用于附加 WordPress 不支持的路径中的图像 (wp-content)
Here's some sample code to attach an image from a path not supported by WordPress (wp-content)
几个月前我就不得不这样做。这是可能的,但它不仅是黑客和无证的,我必须挖掘 WordPress 源代码才能弄清楚。我当时写的:
就像我说的,很乱,但是我到处寻找更好的方法,但我有理由确信不存在。
I had to do this several months ago. It is possible but not only is it hacky and undocumented I had to dig through wordpress source to figure it out. What I wrote up way back then:
Like I said messy but I searched high and low for a better method and I'm reasonably sure that none exists.
从 Wordpress 3.5 开始,newmediaobject 现在可以半本地识别黑客攻击。
不再需要破解 class-wp-xmlrpc-server.php。
相反,您的 xml-rpc 客户端需要将帖子编号发送到名为 post_id 的变量。 (以前它只是变量“post”)
希望能帮助别人。
As of Wordpress 3.5, newmediaobject now recognizes the hack semi-natively.
it is no longer necessary to hack class-wp-xmlrpc-server.php.
Instead, your xml-rpc client needs to send the post number to a variable called post_id. (Previously it was just the variable 'post')
Hope that helps someone out.