Skip to:
Content
Pages
Categories
Search
Top
Bottom

Hack: bb replies as wp comments; using bb API?

  • @fel64

    Member

    Wanting to integrate bb and wp more, I hacked up wp’s comments.php template to get replies in the forum to show up below posts in the wp section of the site too.

    This currently requires the bbPress Post plugin.

    Fairly simple job: find the corresponding topic, get the replies, and output them. My solution should work for you, too, if you have bbPress post installed and activated as a wp plugin. Code’s below.

    I want to make it possible to reply to the topic from the wp section of the site if you’re logged in. Obviously I could make queries to insert the post into the database, but I’d like to use the bb API so it can be validated correctly, hooks are called etc. Not sure how I would go about making it accessible. Currently calling any bb functions returns the “undefined function” error; how can I make them available for use?

    Paste this in front of the rest of your wp comments.php template:

    <?php
    function felblogtotopicid( $felpostID ) {
    global $table_prefix, $wpdb;
    $posts_table = $table_prefix . "bbpress_post_posts";
    $topic_id = $wpdb->get_var("SELECT topic_id FROM <code.>$posts_table</.code> WHERE <.code>post_id</.code> = $felpostID LIMIT 1;");
    return $topic_id;
    }
    global $post, $wpdb;
    if( $forumtopic = felblogtotopicid( $post->ID ) ) {
    $bbprefix = get_option( 'wpbb_bbprefix' );
    $replies = $wpdb->get_results( '
    SELECT poster_id, post_text, post_time
    FROM ' . $bbprefix . 'posts
    WHERE topic_id = ' . $forumtopic
    );
    array_shift( $replies ); //takes off first entry, ie. starting post, and moves the rest back one
    //$replies = array of object( poster_id, post_text, post_time ) for each post I think
    echo "<ol>n"; //start of list
    foreach( $replies as $reply ) {
    $poster = get_userdata( $reply->poster_id );
    $poster = $poster->user_login;
    echo '<li class="thread">' . "n"
    . '<div class="reply">' . "n"
    . '<div class="poster">' . "n"
    . "<strong>" . $poster . "</strong>n"
    . "<span> @ " . $reply->post_time . "</span>n"
    . "</div>n"
    . '<div class="post">' . "n"
    . $reply->post_text
    . "</div>n"
    . "</div>n"
    . "</li>n";
    }
    echo "</ol>n"; //end of list
    //$replylink = bb_add_replies_to_topic_link( $forumtopic );
    $replylink = get_option( 'wpbb_path' );
    echo '<h3><a href="' . $replylink . '">Reply!</a></h3>' . "n";

    } else { ?>

    and paste this at the very back:

    <?php } //end else conditional for corresponding topic to blogpost ?>

    Example here

Viewing 16 replies - 1 through 16 (of 16 total)
  • @smurfdude

    Member

    I get this error on my comments page

    WordPress database error: [You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ‘wp_bbpress_post_posts WHERE post_id =]

    SELECT topic_id FROM wp_bbpress_post_posts WHERE post_id = 32 LIMIT 1;

    @smurfdude

    Member

    Nevermind i figured it out. You put < code > tags on this line:

    $topic_id = $wpdb->get_var(“SELECT topic_id FROM <code.>$posts_table</.code> WHERE <.code>post_id</.code> = $felpostID LIMIT 1;”);

    Now it works great, big thanks!

    @fel64

    Member

    Oh, bizarre. It must have edited it in somehow. Trent, could you take that out in case someone else comes along? My hour’s up.

    Excellent! :)

    @trent

    Member

    I just noticed this thread fel64! Brilliant! The code above should be edited correctly now!

    Trent

    @fel64

    Member

    Cheers!

    Further hack here, to migrate any comments made to WP posts that have a corresponding bb topic (via the bbPress Post plugin again) as replies to the thread. Unfortunately the date/time won’t be right, it’ll be like a new post just made.

    This needs to be installed/activated as a plugin to work, and to prevent it somehow accidentally happening again I suggest you immediately uninstall it. To run it, simply append “?lulz=p” to a URL and it’ll get to work – make sure you only do this once! An interface would be a lot neater, but, well, meh.

    At your own risk.

    <?php
    /*
    Plugin Name: Comments migrate
    Plugin URI:
    Description: moves wp comments into bb posts.
    Author: fel64
    Version: 0.7
    Author URI: http://www.loinhead.net/
    */
    function felmigrate()
    {
    global $bbdb, $bb_table_prefix;
    //foreach blogpost/topic in wp_bbpress_post_posts
    $bridge = $bbdb->get_results( ' SELECT post_id, topic_id
    FROM wp_bbpress_post_posts', ARRAY_A );
    foreach( $bridge as $sumthing => $link )
    {
    //foreach comment
    $wppost = $link['post_id'];
    $bbtopic = $link['topic_id'];
    $felcoms = $bbdb->get_results( " SELECT comment_author, comment_date, comment_content, comment_author_IP
    FROM wp_comments
    WHERE comment_post_ID = $wppost" );
    if( $felcoms )
    {
    foreach( $felcoms as $sumthing => $felcom )
    {
    //if valid user
    $felu = bb_get_user_by_name( $felcom->comment_author );
    if( $felu )
    {
    //create new post in that thread with said details
    fel_new_post( $bbtopic, $felcom, $felu->ID );
    }
    }
    }
    }
    //party
    }
    function fel_new_post( $topic_id, $post_details, $felID ) {
    global $bbdb, $bb_cache, $bb_table_prefix, $thread_ids_cache;
    $topic_id = (int) $topic_id;

    $bb_post = $post_details->comment_content;
    //$bb_post = apply_filters('pre_post', $bb_post, false, $topic_id);
    $bb_post = htmlspecialchars( $bb_post, ENT_QUOTES );
    $post_status = 0;
    $now = bb_current_time('mysql');
    //$now = $post_details->comment_date;
    $uid = $felID;
    $uname = $post_details->comment_author;
    $ip = $post_details->comment_author_IP;

    $topic = get_topic( $topic_id );
    $forum_id = $topic->forum_id;

    if ( $bb_post && $topic ) {
    $topic_posts = ( 0 == $post_status ) ? $topic->topic_posts + 1 : $topic->topic_posts;
    $bbdb->query("INSERT INTO $bbdb->posts
    (forum_id, topic_id, poster_id, post_text, post_time, poster_ip, post_status, post_position)
    VALUES
    ('$forum_id', '$topic_id', '$uid', '$bb_post','$now', '$ip', '$post_status', $topic_posts)");
    $post_id = $bbdb->insert_id;
    if ( 0 == $post_status ) {
    $bbdb->query("UPDATE $bbdb->forums SET posts = posts + 1 WHERE forum_id = $topic->forum_id");

    /* if( $now < $topic->topic_time )
    {
    $now = $topic->topic_time;
    $uid = $topic->topic_last_poster;
    $uname = $topic->topic_last_poster_name;
    $post_id = $topic->topic_last_post_id;
    }
    */ $bbdb->query("UPDATE $bbdb->topics SET topic_time = '$now', topic_last_poster = '$uid', topic_last_poster_name = '$uname',
    topic_last_post_id = '$post_id', topic_posts = '$topic_posts' WHERE topic_id = '$topic_id'");
    if ( isset($thread_ids_cache[$topic_id]) ) {
    $thread_ids_cache[$topic_id]['post'][] = $post_id;
    $thread_ids_cache[$topic_id]['poster'][] = $uid;
    }
    $post_ids = get_thread_post_ids( $topic_id );
    if ( !in_array($uid, array_slice($post_ids['poster'], 0, -1)) )
    bb_update_usermeta( $uid, $bb_table_prefix . 'topics_replied', $bb_current_user->data->topics_replied + 1 );
    } else
    bb_update_topicmeta( $topic->topic_id, 'deleted_posts', isset($topic->deleted_posts) ? $topic->deleted_posts + 1 : 1 );
    if ( !bb_current_user_can('throttle') )
    bb_update_usermeta( $uid, 'last_posted', time() );
    $bb_cache->flush_one( 'topic', $topic_id );
    $bb_cache->flush_many( 'thread', $topic_id );
    $bb_cache->flush_many( 'forum', $forum_id );
    do_action('bb_new_post', $post_id);
    return $post_id;
    } else {
    return false;
    }
    }

    //plunge
    if( $_GET['lulz'] = 'p' )
    felmigrate();
    ?>

    @trent

    Member

    @lira

    Member

    Erm… hey guys, could you tell me what I’ve done wrong?

    I’ve just installed “bbPress Post”, and WordPress is telling me there’s no table called “wp_bbpress_post_options” (which is true). I reckon I should solve this problem before hacking wp’s comments.php template… but how?

    ps.: Oh, and you guys are doing a great job here, congratulations :)

    @fel64

    Member

    You do need to use that table, but if you installed WP yourself it should also be created when you activate the plugin. Maybe de-activate and re-activate.

    However I’m working on a plugin that will do the entire thing (complete integration hopefully) based on a different, IMO much neater system. I don’t want to promise anything before it’s done, but if this plugin doesn’t work for you there’ll be a simpler alternative soon. :)

    @lira

    Member

    De-activated, re-activated and it can’t even feed the database. I’m hacking it now, but I can’t figure the problem out at all… oh well, I’m going to ask the author for help, and I’m sure looking forward to seeing your plugin, fel64 :)

    @wittmania

    Member

    Fel, great work as usual. I just implemented your original hack (with a few minor mods of my own) on the team blog I just started last week. It is my first attempt at a bbpress-as-comments install, and it is working very well so far. This hack adds the extra comment visibility I was missing.

    Keep up the good work.

    @fel64

    Member

    Got a problem on my hands. I’m trying to simplify a lot of things by require’ing bb-load.php and then using the bb API. However bbdb loads with a fatal error if I do this when wordpress has fully loaded, but it works perfectly fine if I require bb-load when the plugin is run.

    What I mean is require( 'path/to/bb-load.php' ) works fine if placed anywhere inside the main code of the plugin. If I call it using the wp hook init it no longer works, nor does calling it by other hooks (that I’ve tried) or through function calls in templates and the like.

    I went through wp-settings.php and require’d bb-load systematically until I found that it only worked once wordpress had loaded general-template.php (line 153). It worked from any point onwards, including after do_action('init'); (which I don’t understand at all). Using the init hook in my plugin to require it does not work.

    I suspect this means that the init hook in wordpress maybe does something or other, then loads plugins, then does something else that stops bb being included, then runs any other funtions registered with the init hook – but my wp mojo is not impressive. I tested this with all other plugins deactivated.

    The output if bb-load is required too late in the code:

    Fatal error: Call to a member function get_row() on a non-object in D:xampphtdocsforumsbb-includesfunctions.php on line 1224

    That makes me think bbdb is not created, but I can’t see why it wouldn’t be.

    Can someone help me with this please? I’d much rather use the API than duplicate functions.

    @fel64

    Member

    Trent, do you think you could point this topic out to one of those people with mighty WP/bb mojo? Just a gentle pointing out or something. Nothing pushy. :)

    @trent

    Member

    The best bet would be to ask in the bbdevlist as both mdawaffe, matt and other ‘head dudes’ read the list on a regular basis, but visit these forums very seldom….! That is the best way to get some attention to this issue!

    Trent

    @fel64

    Member

    How does this crazy devlist thing work? Signed up but got no emails, so I assume no-one’s talking. I send an email to bbdev@lists.bbpress.org? I don’t want to completely break etiquette or somesuch first time, so I thought I’d wait and see but there isn’t that much to see.

    @chrishajer

    Participant

    The list has been quiet for a while. The last message I have is Volume 30, Issue 1 from May 11, 2007. The one prior to that was Volume 29, Issue 17 dated April 23, 2007.

    @dilshil

    Member

    i tried it but might be some problem check where i use that one

    http://www.dilshil.com

Viewing 16 replies - 1 through 16 (of 16 total)
  • You must be logged in to reply to this topic.
Skip to toolbar