Как применять к постам свои фильтры при их постинге

Итак все мы прекрасно знаем, что можно по разному добавлять посты в блог.
Кто-то фигарит из админки.
Кто-то через стороннюю прогу через xmlrpc.php
Кто-то через мыло
Кто-то спец плагинами автонаполняет

Вопрос 1: Я так понимаю что это всё через какую то ведь функцию делается. Через какую?
Вопрос 2: Можно ли как то воздействовать на пост до попадания его в базу? Ну например поставить фильтр там какой нить, который будет вырезать все ссылки. Как это сделать?

p.s. я понимаю, что можно сделать что-то типа:

    add_action('the_excerpt', 'no_link_func',10001);
    add_action('the_content', 'no_link_func',10001);

Но задача воздействовать функцией no_link_func до того, как в базу попадёт пост. Т.е. чтобы оригинальный текст уже был почищенным.

http://codex.wordpress.org/Plugin_API/Action_Reference

Спасибо Ю.Б вам огромное. Ткнули куда нужно, но поковырявшись я так и не понял как это сделать. Нигде никаких примеров нету. Проверял через плагинчик. В нём функция поставил для проверки:

function clean_post_j ($data)
    {
 $data = preg_replace ("1","2",$data);

    return $data;
}


add_action('publish_post', 'clean_post_j',10002);

При отправлении поста выкидывает ошибку

Я так прикинул, что может быть это какой нить массив и тогда решил глянуть, что там и как:

function clean_post_j ($data)
    {
//     $data = preg_replace ("1","2",$data);
 print_r ($data);
    return $data;
}


add_action('publish_post', 'clean_post_j',10002);

Но мне один фиг при отправлении поста выкидывает ошибку

Пробовал попытаться записать в файл:

function clean_post_j ($data)
    {
      $out = $data
      $fp = fopen(ABSPATH . 'data_clean.html', "w");
      fwrite($fp, $out);
      fclose($fp);
    return $data;
}


add_action('publish_post', 'clean_post_j',10002);

Ошибку не выкидывает, а в файл пишет ID поста.

А как воздействовать на сам пост (Название и само содержание (хотя и выдержка тоже)) я так и не понял. Поискал опять же на http://wordpress.org/tags/publish_post и ничего путного не нашёл.

Тяжко то, что я по буржуйске не бельмесо. Благо там читать то нечего, переводчик справляется, но даже при помощи него я не нашёл, как же воздействовать на посты. Повторюсь:
Можно ли как то воздействовать на пост до попадания его в базу? Ну например поставить фильтр там какой нить, который будет вырезать все ссылки. Как это сделать?

Ошибку не выкидывает, а в файл пишет ID поста.

Ну дык! Дока гласит "Action function arguments: post ID."

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

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

Обращение ко всем. Если кто-то сталкивался с моей проблемой или же встречал подобный (описываемый в этом топике вариант) плагин, то просьба отпишитесь сдесь или подскажите по делу как и что.

Благодарю за благородство

Хм… Сечас просмотрел цепочку постинга. Ан нет там никаких фильтров по дороге (или я недоглядел). Может нужно по ID вынимать пост из базы, перелопачивать и класть взад?

Обращение ко всем. Если кто-то сталкивался с моей проблемой... подскажите по делу как и что.

Как сработал фильтр, получаешь из $data его ID и толкаеш в wp_get_single_post(…), а после того как ты грязно надругался над телом беззащитного поста делаешь wp_update_post(…). Должно помочь.

Могу посоветовать разобрать по косточкам 🙂 xmlrpc.php. Много полезного и интересного можно найти. Но вообще фильтры тоже можно использовать, например content_save_pre

Короче по совету Роланда (он же Svolochuga) … привёл плагин к такому виду:

<?php
/*
Plugin Name: Cleaner Posts (J)
Plugin URI: http://blog.jawsik.com
Description: Плагин проверочный, который нужен для того, чтобы проверить воздействие на отправляемые посты
Author: JawsIk <work@jawsik.com>
Contributor: JawsIk <work@jawsik.com>
Author URI: http://blog.jawsik.com/
Version: 0.01 beta
*/ 

function clean_post_j ($data)
    {
        $xx = wp_get_single_post($data);
        if ( is_object($xx) ) $xx = get_object_vars($xx);

        $xx[post_content] = preg_replace("|1\.11|","2.22",$xx[post_content]);
        $xx[post_excerpt] = preg_replace("|1\.11|","2.22",$xx[post_excerpt]);

        wp_insert_post($xx);
        return $data;
    }


add_action('publish_post', 'clean_post_j');

?>

Далее захожу в админку. И делаю новый пост. В посте естественно всталяю для проверки 1.11 и нажимаю отправить.

В результате пост поститься. Замена тоже происходит и всё вроде бы хорошо, но вот именно когда я создал пост и нажал "Опубликовать".

У меня выскакивает http://yourwp.com/wp-admin/post.php

с ошибкой в браузере:

ERROR
The requested URL could not be retrieved

While trying to retrieve the URL: http://yourwp.com/wp-admin/post.php

The following error was encountered: 
Zero Sized Reply 

Squid did not receive any data for this request.

Это в опере. В IE тоже самое. Т.е. от браузера это не зависит. Отключаю плагин и из админки посты постятся как обычно, но замены естественно нет.

В чём касячина? кто знает?

Попробуй типа так:

if ( is_object($xx) )  {
        $xx = get_object_vars($xx);
        $xx[post_content] = preg_replace("|1\.11|","2.22",$xx[post_content]);
        $xx[post_excerpt] = preg_replace("|1\.11|","2.22",$xx[post_excerpt]);
        wp_insert_post($xx);
}

Тоже самое… странное что-то вториться… главное когда я не делаю никаких преобразований… пост проходит

(комментировал весь плагин и пробовал)

<?php
/*
Plugin Name: Maxsite post-post
Plugin URI: http://maxsite.org/
Description: post-post
Author: MAX
Version: 1.0 
Author URI: http://maxsite.org/
*/

function maxsite_post_post($content) {
    return $content . ' УРА!!!';
}

add_filter('content_save_pre', 'maxsite_post_post');

?>

Это я называю "не выдержала душа поэта" 🙂

Спасибо Всем. Ну а в итоге конечно же тёзке

p.s. а всё работатет 🙂

Подскажите как сделать чтобы моя функция отрабатывалась только один раз – когда создался пост.
И чтобы она не отрабатывалась когда пост редактируется.
Пробовал через add_action(‘publish_post’, ‘своя функция’);

Но в этом случае своя функция работает и при редактировании

Anonymous
Отправить
Ответ на: