bbp_move_reply_handler( string $action = '' )
Move reply handler
Description
Handles the front end move reply submission
Parameters
- $action
-
(Optional) The requested action to compare this function to
Default value: ''
Source
File: bp-forums/replies/functions.php
function bbp_move_reply_handler( $action = '' ) {
// Bail if action is not 'bbp-move-reply'
if ( 'bbp-move-reply' !== $action )
return;
// Prevent debug notices
$move_reply_id = $destination_topic_id = 0;
$destination_topic_title = '';
$destination_topic = $move_reply = $source_topic = '';
/** Move Reply ***********************************************************/
if ( empty( $_POST['bbp_reply_id'] ) ) {
bbp_add_error( 'bbp_move_reply_reply_id', __( '<strong>ERROR</strong>: Reply ID to move not found!', 'buddyboss' ) );
} else {
$move_reply_id = (int) $_POST['bbp_reply_id'];
}
$move_reply = bbp_get_reply( $move_reply_id );
// Reply exists
if ( empty( $move_reply ) )
bbp_add_error( 'bbp_mover_reply_r_not_found', __( '<strong>ERROR</strong>: The reply you want to move was not found.', 'buddyboss' ) );
/** Topic to Move From ***************************************************/
// Get the reply's current topic
$source_topic = bbp_get_topic( $move_reply->post_parent );
// No topic
if ( empty( $source_topic ) ) {
bbp_add_error( 'bbp_move_reply_source_not_found', __( '<strong>ERROR</strong>: The discussion you want to move from was not found.', 'buddyboss' ) );
}
// Nonce check failed
if ( ! bbp_verify_nonce_request( 'bbp-move-reply_' . $move_reply->ID ) ) {
bbp_add_error( 'bbp_move_reply_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'buddyboss' ) );
return;
}
// Use cannot edit topic
if ( !current_user_can( 'edit_topic', $source_topic->ID ) ) {
bbp_add_error( 'bbp_move_reply_source_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the source discussion.', 'buddyboss' ) );
}
// How to move
if ( !empty( $_POST['bbp_reply_move_option'] ) ) {
$move_option = (string) trim( $_POST['bbp_reply_move_option'] );
}
// Invalid move option
if ( empty( $move_option ) || !in_array( $move_option, array( 'existing', 'topic' ) ) ) {
bbp_add_error( 'bbp_move_reply_option', __( '<strong>ERROR</strong>: You need to choose a valid move option.', 'buddyboss' ) );
// Valid move option
} else {
// What kind of move
switch ( $move_option ) {
// Into an existing topic
case 'existing' :
// Get destination topic id
if ( empty( $_POST['bbp_destination_topic'] ) ) {
bbp_add_error( 'bbp_move_reply_destination_id', __( '<strong>ERROR</strong>: Destination discussion ID not found!', 'buddyboss' ) );
} else {
$destination_topic_id = (int) $_POST['bbp_destination_topic'];
}
// Get the destination topic
$destination_topic = bbp_get_topic( $destination_topic_id );
// No destination topic
if ( empty( $destination_topic ) ) {
bbp_add_error( 'bbp_move_reply_destination_not_found', __( '<strong>ERROR</strong>: The discussion you want to move to was not found!', 'buddyboss' ) );
}
// User cannot edit the destination topic
if ( !current_user_can( 'edit_topic', $destination_topic->ID ) ) {
bbp_add_error( 'bbp_move_reply_destination_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the destination discussion!', 'buddyboss' ) );
}
// Bump the reply position
$reply_position = bbp_get_topic_reply_count( $destination_topic->ID ) + 1;
// Update the reply
wp_update_post( array(
'ID' => $move_reply->ID,
'post_title' => sprintf( __( 'Reply To: %s', 'buddyboss' ), $destination_topic->post_title ),
'post_name' => false, // will be automatically generated
'post_parent' => $destination_topic->ID,
'menu_order' => $reply_position,
'guid' => ''
) );
// Adjust reply meta values
bbp_update_reply_topic_id( $move_reply->ID, $destination_topic->ID );
bbp_update_reply_forum_id( $move_reply->ID, bbp_get_topic_forum_id( $destination_topic->ID ) );
break;
// Move reply to a new topic
case 'topic' :
default :
// User needs to be able to publish topics
if ( current_user_can( 'publish_topics' ) ) {
// Use the new title that was passed
if ( !empty( $_POST['bbp_reply_move_destination_title'] ) ) {
$destination_topic_title = esc_attr( strip_tags( $_POST['bbp_reply_move_destination_title'] ) );
// Use the source topic title
} else {
$destination_topic_title = $source_topic->post_title;
}
// Update the topic
$destination_topic_id = wp_update_post( array(
'ID' => $move_reply->ID,
'post_title' => $destination_topic_title,
'post_name' => false,
'post_type' => bbp_get_topic_post_type(),
'post_parent' => $source_topic->post_parent,
'guid' => ''
) );
$destination_topic = bbp_get_topic( $destination_topic_id );
// Make sure the new topic knows its a topic
bbp_update_topic_topic_id( $move_reply->ID );
// Shouldn't happen
if ( false === $destination_topic_id || is_wp_error( $destination_topic_id ) || empty( $destination_topic ) ) {
bbp_add_error( 'bbp_move_reply_destination_reply', __( '<strong>ERROR</strong>: There was a problem converting the reply into the discussion. Please try again.', 'buddyboss' ) );
}
// User cannot publish posts
} else {
bbp_add_error( 'bbp_move_reply_destination_permission', __( '<strong>ERROR</strong>: You do not have the permissions to create new discussions. The reply could not be converted into a discussion.', 'buddyboss' ) );
}
break;
}
}
// Bail if there are errors
if ( bbp_has_errors() ) {
return;
}
/** No Errors - Clean Up **************************************************/
// Update counts, etc...
do_action( 'bbp_pre_move_reply', $move_reply->ID, $source_topic->ID, $destination_topic->ID );
/** Date Check ************************************************************/
// Check if the destination topic is older than the move reply
if ( strtotime( $move_reply->post_date ) < strtotime( $destination_topic->post_date ) ) {
// Set destination topic post_date to 1 second before from reply
$destination_post_date = date( 'Y-m-d H:i:s', strtotime( $move_reply->post_date ) - 1 );
// Update destination topic
wp_update_post( array(
'ID' => $destination_topic_id,
'post_date' => $destination_post_date,
'post_date_gmt' => get_gmt_from_date( $destination_post_date )
) );
}
// Set the last reply ID and freshness to the move_reply
$last_reply_id = $move_reply->ID;
$freshness = $move_reply->post_date;
// Get the reply to
$parent = bbp_get_reply_to( $move_reply->ID );
// Fix orphaned children
$children = get_posts( array(
'post_type' => bbp_get_reply_post_type(),
'meta_key' => '_bbp_reply_to',
'meta_value' => $move_reply->ID,
) );
foreach ( $children as $child )
bbp_update_reply_to( $child->ID, $parent );
// Remove reply_to from moved reply
delete_post_meta( $move_reply->ID, '_bbp_reply_to' );
// It is a new topic and we need to set some default metas to make
// the topic display in bbp_has_topics() list
if ( 'topic' === $move_option ) {
bbp_update_topic_last_reply_id ( $destination_topic->ID, $last_reply_id );
bbp_update_topic_last_active_id ( $destination_topic->ID, $last_reply_id );
bbp_update_topic_last_active_time( $destination_topic->ID, $freshness );
// Otherwise update the existing destination topic
} else {
bbp_update_topic_last_reply_id ( $destination_topic->ID );
bbp_update_topic_last_active_id ( $destination_topic->ID );
bbp_update_topic_last_active_time( $destination_topic->ID );
}
// Update source topic ID last active
bbp_update_topic_last_reply_id ( $source_topic->ID );
bbp_update_topic_last_active_id ( $source_topic->ID );
bbp_update_topic_last_active_time( $source_topic->ID );
/** Successful Move ******************************************************/
// Update counts, etc...
do_action( 'bbp_post_move_reply', $move_reply->ID, $source_topic->ID, $destination_topic->ID );
// Redirect back to the topic
wp_safe_redirect( bbp_get_topic_permalink( $destination_topic->ID ) );
// For good measure
exit();
}
Changelog
| Version | Description |
|---|---|
| bbPress (r4521) | Introduced. |
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.