Идентификатор сообщения доступа в "content_save_pre"

Первый раз, помилуй мои ошибки.

Я пытаюсь использовать фильтр 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; } не 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, которое, я думаю, использует интерфейс XML-RPC для самостоятельного размещения WordPress, global $post не заполняется и common_save (метод, который сохраняет настраиваемые common_save ) и set_post_format не работают без него.

Есть ли в любом случае $post->ID в XML-RPC «content_save_pre», чтобы это могло работать? Я использую add_action('all', ...) чтобы убедиться, что экономия XML-RPC действительно работает, и она определенно называется, она просто не может продолжаться из-за отсутствия заполнения $post .

Другая альтернатива, я думал, должен был приложить специальную обычную мета, а затем использовать часто назначенный cron-дескриптор позже, но это кажется сложным, и мне придется глубоко погрузиться в это.

Благодаря!

Solutions Collecting From Web of "Идентификатор сообщения доступа в "content_save_pre""

После запроса и поиска альтернатив, я придумал рабочее решение, которое работает в веб-интерфейсе и в приложениях на базе Android / iOS XML-RPC.

Это фильтр.

 add_filter('wp_insert_post_data', array($this, 'save_content2'), 9, 2); 

Я уверен, что он вызывается перед фильтром content_save_pre . Он позволяет получить прямой доступ к постовым полям, таким как почтовый контент и метаданные сообщения, такие как идентификатор.

 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; } не 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; } 

Что изменилось: аргументы, теперь данные и некоторые метаданные сообщения, такие как идентификатор, оба доступны здесь чисто. Возвращаемые значения были заменены с $content на $data и когда первая строка действительно изменена, результат сохраняется в поле $data['post_content'] и возвращается весь массив.

Хотя это работает, любые другие предложения абсолютно приветствуются.