Несмотря на то, что форум здесь по большому счёту нахрен никому не нужен и используется мной как личный-публичный блокнот, когда-то начатая мной затея кросспостинга из блога в форум, кривая и неуклюжая, синхронно трудится здесь в паре с моим больным воображением.
Редкий постоянный посетитель давно заметил, что плагин к WordPress косячит, и "не понимает", что кросспостинг был выполнен ранее, и продолжает загаживать форум на каждый чих. Это было первой причиной, по которой я взялся править код.
А второй причиной стал мой давний разговор с Вадимом Стеркиным. Как-то вечером я втирал ему что-то про форум, и Вадим между дел отметил, что ему было бы интересно посмотреть на решение с интеграцией форума phpbb с движком WordPress, в частности,
- создание темы на форуме синхронно с новым постом в блоге;
- перелинковка с созданной темой;
- отображение постов на форуме в виде комментариев к статье.
Я помню, в тот момент подобное мне показалась если не совсем простой, то вполне достижимой целью, и вчера ближе к полночи я решил порешать задачу и порешить баг.
И всё завертелось
Больше всего на свете, сука, я ненавижу разбираться в своем же коде. У меня профессиональные навыки настолько альтернативно развиты, что, открыв свой код полугодичной давности, я вхожу в ступор. Отделаться от ощущения, что это кривое полотно написали инопланетяне, а не ты, первые несколько минут очень сложно.
Да ну да ладно.
Я долго, но тщетно пытался откопать, что в моем коде могло сломаться. Во избежание повторного репоста я использовал метаданные поста WordPress и вызов функции update_post_meta из моего плагина. Очевидно, что-то было не так в королевстве Датском именно с метаданными.
Мой любимый способ отладки кода - гипноз. Я довольно долго гипнотизировал исходник, пытаясь понять, что я мог написать неправильно.
На первый, второй и третий взгляд всё было хорошо.
Я принялся за отладку, в процессе которой обнаружил, что update_post_meta перестает работать после подключения к базе данных форума.
Подозреваю, что ноги растут из-за вышедшего обновления Wordpress 3.5.1, в котором добавлен мультиблоггинг, и которое я по лени накатил совсем недавно. Вероятно, ещё одно активное MySQL-подключение сводит update_post_meta функцию с ума. Равно как и фейлят и попытки использовать $wpdb->query();
В качестве временной меры я вынес установку метаданных до подключения к БД.
Конечно, это плохое решение, такое же плохое решение, как и реализация этого плагина. Умные люди обычно читают руководство разработчика WordPress, рекомендации плагинописателям и Release notes для ветки 3.5. А я открыл исходники WordPress...
"Я не стану думать об этом сейчас. Я подумаю об этом завтра"
и вспомнил Скарлетт О`Хара из "Унесенных ветром". Букв было много, времени до утра было мало, поэтому я успокоил себя (костыль воткнут, работает система) и завалился спать.
Я обещаю себе разобраться в вопросе, убрать костыль и показать уже Стеркину рабочий прототип. В конце-концов, мне это ещё и интересно.
Все заинтересованные личности могут посмотреть исходник ниже и усвоить для себя, как писать не надо:
<?php
/*
Plugin Name: wp2phpbb
Plugin URI: https://winreviewer.com
Description: Cross-posting to phpbb forum.
Version: 1.5
Author: Happy Bulldozer
Author URI: https://winreviewer.com
License: GPL2
*/
require('db.php');
require('config.php');
function wp2phpbb($post_ID)
{
global $phpbb_dbhost,$phpbb_dbuser,$phpbb_dbpasswd,$phpbb_dbname;
global $phpbb_user_id,$phpbb_user_name,$phpbb_user_ip,$phpbb_user_colour;
global $phpbb_forum_id;
$time = time();
$post = get_post($post_ID);
$phpbb_meta = intval(get_post_meta($post_ID, 'phpbb', true));
if ($phpbb_meta == 0)
{
///TODO: fix the shit
update_post_meta($post_ID, 'phpbb',1);
$phpbb_topic_title = $post->post_title;
$link = get_permalink($post_ID);
$phpbb_post_text_ar= explode('<!--more-->', $post->post_content);
$phpbb_post_text = '<span style="color: #0000FF"><span style="font-size: 150%; line-height: 116%;"><span style="font-weight: bold">'.$phpbb_topic_title.'</span></span></span><br />'.$phpbb_post_text_ar[0].' <a href="'.$link.'">Читать полностью...</a>';
$phpbb_success=false;
$phpbb=new db;
if (!$phpbb->db_Connect($phpbb_dbhost , $phpbb_dbuser, $phpbb_dbpasswd , $phpbb_dbname))
{
die('forum connection failed');
}
$query = 'insert into phpbb_topics
(forum_id,topic_approved,topic_title,topic_poster,topic_time,topic_views)
values
('.$phpbb_forum_id.',1,\''.$phpbb_topic_title.'\','.$phpbb_user_id.','.$time.', 0)';
$phpbb->db_Query($query,true);
$phpbb_topic_id = $phpbb->LAST_ID;
if ( $phpbb_topic_id > 0 )
{
$query = 'insert into phpbb_posts
(topic_id,forum_id,poster_id,poster_ip,post_time,post_approved,
post_username,post_text,post_subject,bbcode_uid,bbcode_bitfield)
values ('.$phpbb_topic_id.','.$phpbb_forum_id.','.$phpbb_user_id.',\''.$phpbb_user_ip.'\','.$time.',1,
\'\',\''.$phpbb_post_text.'\',\''.$phpbb_topic_title.'\',\'\',\'\')';
$phpbb->db_Query($query,true);
$phpbb_post_id = $phpbb->LAST_ID;
if ($phpbb_post_id>0)
{
//recount num of replies and statistics
$query = 'update phpbb_topics tp,
(select topic_id,count(post_id)-1 as cnt from phpbb_posts where topic_id = '.$phpbb_topic_id.' group by topic_id) p
set topic_replies=p.cnt, topic_replies_real=p.cnt,
topic_last_post_id = '.$phpbb_post_id.',
topic_last_poster_id = '.$phpbb_user_id.',
topic_first_post_id = '.$phpbb_post_id.',
topic_first_poster_name = \''.$phpbb_user_name.'\',
topic_first_poster_colour = \''.$phpbb_user_colour.'\',
topic_last_poster_name = \''.$phpbb_user_name.'\',
topic_last_poster_colour=\''.$phpbb_user_colour.'\',
topic_last_post_time = '.$time.',
topic_last_view_time = '.$time.',
topic_views = 1
where tp.topic_id=p.topic_id and tp.topic_id = '.$phpbb_topic_id;
$phpbb->db_Query($query);
//recount forums messages & statistics
UpdateForumStats($phpbb, $phpbb_forum_id,$phpbb_post_id,$phpbb_user_id,$phpbb_user_name,$time,$phpbb_user_colour);
//user - post count & last visit
$query = 'update phpbb_users pu,
(select poster_id,count(post_id) cnt from phpbb_posts where poster_id = '.$phpbb_user_id.' group by poster_id) pc
set pu.user_posts=pc.cnt,
user_lastvisit = '.$time.',
user_lastpost_time = '.$time.'
where pu.user_id=pc.poster_id and pu.user_id = '.$phpbb_user_id;
$phpbb->db_Query($query);
//pointless table
$query = 'select count(topic_posted) cnt from phpbb_topics_posted where topic_id='.$phpbb_topic_id.' and user_id='.$phpbb_user_id;
$phpbb->db_Query($query);
$phpbb_topics_posted_row = $phpbb->db_Fetch();
$phpbb_topics_posted = $phpbb_topics_posted_row['cnt'];
if ($phpbb_topics_posted==0)
{
$query = 'insert into phpbb_topics_posted (topic_id,user_id,topic_posted)
values ('.$phpbb_topic_id.','.$phpbb_user_id.',1)';
$phpbb->db_Query($query);
}
$phpbb_success=true;
$phpbb->db_Close();
unset($phpbb);
}
//add post_meta
/*if ($phpbb_success)
{
update_post_meta(intval($post_ID), 'phpbb',intval($phpbb_topic_id));
}*/
}//phpbb_topic_id check
}//post meta check
return $post_ID;
}
function UpdateForumStats($osql, $pforum_id,$pforum_last_post_id,$pforum_last_poster_id,$pforum_last_poster_name,$pforum_last_post_time,$pposter_colour,$current_level=true)
{
if($pforum_id>0)
{
$query='select parent_id,forum_posts,forum_topics,forum_topics_real from phpbb_forums where forum_id = '.$pforum_id;
$osql->db_Query($query);
$orow = $osql->db_Fetch();
$parent_id = intval($orow['parent_id']);
$forum_posts = intval($orow['forum_posts'])+1;
$forum_topics = intval($orow['forum_topics'])+1;
$forum_topics_real = intval($orow['forum_topics_real'])+1;
$query='update phpbb_forums set '.
($current_level ? 'forum_posts='.$forum_posts.',' : '').
($current_level ? 'forum_topics_real='.$forum_topics_real.',' : '').
($current_level ? 'forum_topics='.$forum_topics.',' : '').'
forum_last_post_id='.$pforum_last_post_id.',
forum_last_poster_id='.$pforum_last_poster_id.',
forum_last_poster_name=\''.$pforum_last_poster_name.'\',
forum_last_post_time='.$pforum_last_post_time.' ,
forum_last_poster_colour=\''.$pposter_colour.'\'
where forum_id = '.$pforum_id;
$osql->db_Query($query);
//strange, but phpbb uses 'forum_posts' update only for current level
UpdateForumStats($osql, $parent_id,$pforum_last_post_id,$pforum_last_poster_id,$pforum_last_poster_name,$pforum_last_post_time,$pposter_colour,false);
}
}
function LoadSpecifiedForum($forum_id=0, $limit=5, $forum_url="https://winreview/forum/", $href_class="", $item_start="", $item_end="")
{
global $dbhost,$dbuser,$dbpasswd,$dbname;
$query="select topic_id,topic_title from phpbb_topics where forum_id=".$forum_id." ORDER BY topic_id DESC LIMIT 0,".$limit;
$result = "";
$phpbb=new db;
if ($phpbb->db_Connect($dbhost , $dbuser, $dbpasswd , $dbname))
{
$phpbb->db_Query($query);
while ($row=$phpbb->db_Fetch())
{
$result .= $item_start.'<a href="'.$forum_url.'viewtopic.php?f='.$forum_id.'&t='.$row['topic_id'].'" title="'.$row['topic_title'].'">'.$row['topic_title'].'</a>'.$item_end;
}
}
echo $result;
}
function LoadLatestPosts($limit=5,$forum_url="https://winreview/forum/", $href_class="", $item_start="", $item_end="")
{
global $dbhost,$dbuser,$dbpasswd,$dbname;
#group_id in (1,2,3,7) guests, users,users_coppa, newbies
#gr.auth_role_id 16 - noaccess, 26 - view only
$result = "";
$phpbb=new db;
if ($phpbb->db_Connect($dbhost , $dbuser, $dbpasswd , $dbname))
{
$query="select config_value from phpbb_config where config_name='posts_per_page'";
$phpbb->db_Query($query);
$row=$phpbb->db_Fetch();
$posts_per_page = $row['config_value'];
$query="select distinct topic_id,topic_title,topic_last_poster_name,topic_last_post_id,topic_replies_real from phpbb_topics t
inner join phpbb_acl_groups gr on gr.forum_id=t.forum_id and group_id in (1,2,3,7)
where t.forum_id not in (select forum_id from phpbb_acl_groups where gr.auth_role_id in (16,26))
ORDER BY topic_last_post_id DESC LIMIT 0,".$limit;
$phpbb->db_Query($query);
while ($row=$phpbb->db_Fetch())
{
$start = intval( ceil( $row['topic_replies_real'] / $posts_per_page ) )*$posts_per_page;
$start_url=$start>0 ? "start=".$start : "";
$result .= $item_start.'<a href="'.$forum_url.'viewtopic.php?f='.$forum_id.'&t='.$row['topic_id'].'&'.$start_url.'#p'.$row['topic_last_post_id'].'" title="'.$row['topic_title'].'">'.$row['topic_title'].' ('.$row['topic_last_poster_name'].')</a>'.$item_end;
}
}
echo $result;
}
add_action('publish_post', 'wp2phpbb');
?>
💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.
