第一次海报,请原谅我的错误。
我正在尝试使用content_save_pre
筛选以获取帖子第一行中的URL并将其保存到自定义元中,还可以将帖子格式设置为链接。大多数情况下,所有这些都很好。
public function save_content($content) {
// short circuit if special ignore tag is included anywhere in content
if ( stripos($content, "<!--ignore-->") != false ) {
return $content;
}
$lines = explode("\\n", $content);
// added href handling so that HTML anchor-links can be handled
$regex = \'/(?:href="([^\\s"]+))|((?:http|https|ftp|ftps)\\:\\/\\/[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,4}(?:\\/\\S*)?)/\';
$match = preg_match($regex, $lines[0], $matches);
if ( $match ) {
$url = $matches[0];
$url = preg_replace(\'/&?utm_(.*?)\\=[^&]+/im\', \'\', $url);
global $post;
if ( $post == null || !isset($post->ID) ) {
// this is part of the problem
return $content;
}
$result = $this->common_save($post->ID, \\LinkedList\\Meta::SOURCE_URL, $url);
// prevent save fields from overwriting a blank on top of just added value
add_filter(\'linked_list_save_fields\', function($bool){
return false;
});
set_post_format($post->id, \'link\');
unset($lines[0]);
return join("\\n", $lines);
}
return $content;
}
我在其他地方为该方法添加了过滤器,但如下所示:
add_filter(\'content_save_pre\', array($this, \'save_content\'), 9, 1);
我遇到的问题是,在使用Android/iOS WordPress应用程序时,我认为它使用的是自托管WordPress的XML-RPC接口
global $post
未填充,并且
common_save
(保存自定义元字段的方法)和
set_post_format
没有它不要工作。
还有什么$post->ID
而在XML-RPC的“content\\u save\\u pre”中,这是否可以工作?我一直在使用add_action(\'all\', ...)
要查看XML-RPC保存是否确实有效,并且它肯定正在被调用,它只是无法继续,因为缺少$post
正在填充。
我认为另一种选择是附加一个特殊的自定义元,然后稍后使用一个频繁调度的cron来处理它,但这似乎很复杂,我必须深入研究它。
谢谢
SO网友:Ryan Rampersad
在四处询问并寻找替代方案后,我想出了一个在web前端和基于Android/iOS XML-RPC的应用程序中都能正常工作的解决方案。
这是过滤器。
add_filter(\'wp_insert_post_data\', array($this, \'save_content2\'), 9, 2);
我很确定它在
content_save_pre
滤器它允许直接访问post字段(如post内容)和post元数据(如ID)。
public function save_content2($data, $post) {
$content = $data[\'post_content\'];
// short circuit if special ignore tag is included anywhere in content
if ( stripos($content, "<!--ignore-->") != false ) {
return $data;
}
if ( trim($content) == \'\' ) {
return $data;
}
$lines = explode("\\n", $content);
if ( count($lines) == 0 ) {
return $data;
}
// added href handling so that HTML anchor-links can be handled
$regex = \'/(?:href="([^\\s"]+))|((?:http|https|ftp|ftps)\\:\\/\\/[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,4}(?:\\/\\S*)?)/\';
$match = preg_match($regex, $lines[0], $matches);
if ( $match ) {
$url = $matches[0];
$url = preg_replace(\'/&?utm_(.*?)\\=[^&]+/im\', \'\', $url);
if ( !isset($post) || !isset($post[\'ID\']) || $post[\'ID\'] == 0 ) {
return $data;
}
$result = $this->common_save($post[\'ID\'], \\LinkedList\\Meta::SOURCE_URL, $url);
// prevent save fields from overwriting a blank on top of just added value
add_filter(\'linked_list_save_fields\', function($bool){
return false;
});
set_post_format($post[\'ID\'], \'link\');
unset($lines[0]);
$data[\'post_content\'] = join("\\n", $lines);
return $data;
}
return $data;
}
发生了什么变化:参数、现在的数据和一些post元数据(如ID)都可以在这里清晰地使用。返回值已从
$content
到
$data
当第一行确实被更改时,结果将保存回
$data[\'post_content\']
字段,并返回整个数组。
虽然这是可行的,但任何其他建议都是绝对受欢迎的。