/** * Return the approve link of the topic * * @since 2.6.0 bbPress (r5504) * * @param array $args This function supports these args: * - id: Optional. Topic id * - link_before: Before the link * - link_after: After the link * - sep: Separator between links * - approve_text: Approve text * - unapprove_text: Unapprove text * @uses bbp_get_topic_id() To get the topic id * @uses bbp_get_topic() To get the topic * @uses current_user_can() To check if the current user can approve the topic * @uses bbp_is_topic_pending() To check if the topic is pending * @uses add_query_arg() To add custom args to the url * @uses wp_nonce_url() To nonce the url * @uses esc_url() To escape the url * @uses apply_filters() Calls 'bbp_get_topic_approve_link' with the link * and args * @return string Topic approve link */ function bbp_get_topic_approve_link($args = array()) { // Parse arguments against default values $r = bbp_parse_args($args, array('id' => 0, 'link_before' => '', 'link_after' => '', 'sep' => ' | ', 'approve_text' => esc_html_x('Approve', 'Pending Status', 'bbpress'), 'unapprove_text' => esc_html_x('Unapprove', 'Pending Status', 'bbpress')), 'get_topic_approve_link'); $topic = bbp_get_topic($r['id']); if (empty($topic) || !current_user_can('moderate', $topic->ID)) { return; } $display = bbp_is_topic_pending($topic->ID) ? $r['approve_text'] : $r['unapprove_text']; $uri = add_query_arg(array('action' => 'bbp_toggle_topic_approve', 'topic_id' => $topic->ID)); $uri = wp_nonce_url($uri, 'approve-topic_' . $topic->ID); $retval = $r['link_before'] . '<a href="' . esc_url($uri) . '" class="bbp-topic-approve-link">' . $display . '</a>' . $r['link_after']; return apply_filters('bbp_get_topic_approve_link', $retval, $r, $args); }
/** * Do the actual topic toggling * * This function is used by `bbp_toggle_topic_handler()` to do the actual heavy * lifting when it comes to toggling topic. It only really makes sense to call * within that context, so if you need to call this function directly, make sure * you're also doing what the handler does too. * * @since 2.6.0 bbPress (r6133) * @access private * * @param array $args */ function bbp_toggle_topic($args = array()) { // Parse the arguments $r = bbp_parse_args($args, array('id' => 0, 'action' => '', 'sub_action' => '', 'data' => array())); // Build the nonce suffix $nonce_suffix = bbp_get_topic_post_type() . '_' . (int) $r['id']; // Default return values $retval = array('status' => 0, 'message' => '', 'redirect_to' => bbp_get_topic_permalink($r['id'], bbp_get_redirect_to()), 'view_all' => false); // What action are we trying to perform? switch ($r['action']) { // Toggle approve/unapprove case 'bbp_toggle_topic_approve': check_ajax_referer("approve-{$nonce_suffix}"); $is_pending = bbp_is_topic_pending($r['id']); $retval['view_all'] = !$is_pending; // Toggle $retval['status'] = true === $is_pending ? bbp_approve_topic($r['id']) : bbp_unapprove_topic($r['id']); // Feedback $retval['message'] = true === $is_pending ? __('<strong>ERROR</strong>: There was a problem approving the topic.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem unapproving the topic.', 'bbpress'); break; // Toggle open/close // Toggle open/close case 'bbp_toggle_topic_close': check_ajax_referer("close-{$nonce_suffix}"); $is_open = bbp_is_topic_open($r['id']); // Toggle $retval['status'] = true === $is_open ? bbp_close_topic($r['id']) : bbp_open_topic($r['id']); // Feedback $retval['message'] = true === $is_open ? __('<strong>ERROR</strong>: There was a problem closing the topic.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem opening the topic.', 'bbpress'); break; // Toggle sticky/super-sticky/unstick // Toggle sticky/super-sticky/unstick case 'bbp_toggle_topic_stick': check_ajax_referer("stick-{$nonce_suffix}"); $is_sticky = bbp_is_topic_sticky($r['id']); $is_super = false === $is_sticky && !empty($_GET['super']) && "1" === $_GET['super'] ? true : false; // Toggle $retval['status'] = true === $is_sticky ? bbp_unstick_topic($r['id']) : bbp_stick_topic($r['id'], $is_super); // Feedback $retval['message'] = true === $is_sticky ? __('<strong>ERROR</strong>: There was a problem unsticking the topic.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem sticking the topic.', 'bbpress'); break; // Toggle spam // Toggle spam case 'bbp_toggle_topic_spam': check_ajax_referer("spam-{$nonce_suffix}"); $is_spam = bbp_is_topic_spam($r['id']); $retval['view_all'] = !$is_spam; // Toggle $retval['status'] = true === $is_spam ? bbp_unspam_topic($r['id']) : bbp_spam_topic($r['id']); // Feedback $retval['message'] = true === $is_spam ? __('<strong>ERROR</strong>: There was a problem unmarking the topic as spam.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem marking the topic as spam.', 'bbpress'); break; // Toggle trash // Toggle trash case 'bbp_toggle_topic_trash': switch ($r['sub_action']) { case 'trash': check_ajax_referer("trash-{$nonce_suffix}"); $retval['view_all'] = true; $retval['status'] = wp_trash_post($r['id']); $retval['message'] = __('<strong>ERROR</strong>: There was a problem trashing the topic.', 'bbpress'); break; case 'untrash': check_ajax_referer("untrash-{$nonce_suffix}"); $retval['status'] = wp_untrash_post($r['id']); $retval['message'] = __('<strong>ERROR</strong>: There was a problem untrashing the topic.', 'bbpress'); break; case 'delete': check_ajax_referer("delete-{$nonce_suffix}"); $retval['status'] = wp_delete_post($r['id']); $retval['message'] = __('<strong>ERROR</strong>: There was a problem deleting the topic.', 'bbpress'); break; } break; } // Maybe redirect back to the topic's forum if (isset($r['sub_action']) && 'delete' === $r['sub_action']) { $retval['redirect_to'] = bbp_get_forum_permalink($retval['status']->post_parent); } // Add view all if needed if (!empty($retval['view_all'])) { $retval['redirect_to'] = bbp_add_view_all($retval['redirect_to'], true); } // Filter & return return apply_filters('bbp_toggle_topic', $retval, $r, $args); }
/** * Topic Row actions * * Remove the quick-edit action link under the topic title and add the * content and close/stick/spam links * * @since 2.0.0 bbPress (r2485) * * @param array $actions Actions * @param array $topic Topic object * @uses bbp_get_topic_post_type() To get the topic post type * @uses bbp_topic_content() To output topic content * @uses bbp_get_topic_permalink() To get the topic link * @uses bbp_get_topic_title() To get the topic title * @uses current_user_can() To check if the current user can edit or * delete the topic * @uses bbp_is_topic_open() To check if the topic is open * @uses bbp_is_topic_spam() To check if the topic is marked as spam * @uses bbp_is_topic_sticky() To check if the topic is a sticky or a * super sticky * @uses get_post_type_object() To get the topic post type object * @uses add_query_arg() To add custom args to the url * @uses remove_query_arg() To remove custom args from the url * @uses wp_nonce_url() To nonce the url * @uses get_delete_post_link() To get the delete post link of the topic * @return array $actions Actions */ public function row_actions($actions, $topic) { if ($this->bail()) { return $actions; } unset($actions['inline hide-if-no-js']); // Show view link if it's not set, the topic is trashed and the user can view trashed topics if (empty($actions['view']) && bbp_get_trash_status_id() === $topic->post_status && current_user_can('view_trash')) { $actions['view'] = '<a href="' . esc_url(bbp_get_topic_permalink($topic->ID)) . '" title="' . esc_attr(sprintf(__('View “%s”', 'bbpress'), bbp_get_topic_title($topic->ID))) . '" rel="permalink">' . esc_html__('View', 'bbpress') . '</a>'; } // Only show the actions if the user is capable of viewing them :) if (current_user_can('moderate', $topic->ID)) { // Pending // Show the 'approve' and 'view' link on pending posts only and 'unapprove' on published posts only $approve_uri = wp_nonce_url(add_query_arg(array('topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_approve'), remove_query_arg(array('bbp_topic_toggle_notice', 'topic_id', 'failed', 'super'))), 'approve-topic_' . $topic->ID); if (bbp_is_topic_published($topic->ID)) { $actions['unapproved'] = '<a href="' . esc_url($approve_uri) . '" title="' . esc_attr__('Unapprove this topic', 'bbpress') . '">' . _x('Unapprove', 'Unapprove Topic', 'bbpress') . '</a>'; } elseif (!bbp_is_topic_private($topic->ID)) { $actions['approved'] = '<a href="' . esc_url($approve_uri) . '" title="' . esc_attr__('Approve this topic', 'bbpress') . '">' . _x('Approve', 'Approve Topic', 'bbpress') . '</a>'; $actions['view'] = '<a href="' . esc_url(bbp_get_topic_permalink($topic->ID)) . '" title="' . esc_attr(sprintf(__('View “%s”', 'bbpress'), bbp_get_topic_title($topic->ID))) . '" rel="permalink">' . esc_html__('View', 'bbpress') . '</a>'; } // Close // Show the 'close' and 'open' link on published and closed posts only if (in_array($topic->post_status, array(bbp_get_public_status_id(), bbp_get_closed_status_id()))) { $close_uri = wp_nonce_url(add_query_arg(array('topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_close'), remove_query_arg(array('bbp_topic_toggle_notice', 'topic_id', 'failed', 'super'))), 'close-topic_' . $topic->ID); if (bbp_is_topic_open($topic->ID)) { $actions['closed'] = '<a href="' . esc_url($close_uri) . '" title="' . esc_attr__('Close this topic', 'bbpress') . '">' . _x('Close', 'Close a Topic', 'bbpress') . '</a>'; } else { $actions['closed'] = '<a href="' . esc_url($close_uri) . '" title="' . esc_attr__('Open this topic', 'bbpress') . '">' . _x('Open', 'Open a Topic', 'bbpress') . '</a>'; } } // Sticky // Dont show sticky if topic links is spam, trash or pending if (!bbp_is_topic_spam($topic->ID) && !bbp_is_topic_trash($topic->ID) && !bbp_is_topic_pending($topic->ID)) { $stick_uri = wp_nonce_url(add_query_arg(array('topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_stick'), remove_query_arg(array('bbp_topic_toggle_notice', 'topic_id', 'failed', 'super'))), 'stick-topic_' . $topic->ID); if (bbp_is_topic_sticky($topic->ID)) { $actions['stick'] = '<a href="' . esc_url($stick_uri) . '" title="' . esc_attr__('Unstick this topic', 'bbpress') . '">' . esc_html__('Unstick', 'bbpress') . '</a>'; } else { $super_uri = wp_nonce_url(add_query_arg(array('topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_stick', 'super' => '1'), remove_query_arg(array('bbp_topic_toggle_notice', 'topic_id', 'failed', 'super'))), 'stick-topic_' . $topic->ID); $actions['stick'] = '<a href="' . esc_url($stick_uri) . '" title="' . esc_attr__('Stick this topic to its forum', 'bbpress') . '">' . esc_html__('Stick', 'bbpress') . '</a> <a href="' . esc_url($super_uri) . '" title="' . esc_attr__('Stick this topic to front', 'bbpress') . '">' . esc_html__('(to front)', 'bbpress') . '</a>'; } } // Spam $spam_uri = wp_nonce_url(add_query_arg(array('topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_spam'), remove_query_arg(array('bbp_topic_toggle_notice', 'topic_id', 'failed', 'super'))), 'spam-topic_' . $topic->ID); if (bbp_is_topic_spam($topic->ID)) { $actions['spam'] = '<a href="' . esc_url($spam_uri) . '" title="' . esc_attr__('Mark the topic as not spam', 'bbpress') . '">' . esc_html__('Not spam', 'bbpress') . '</a>'; } else { $actions['spam'] = '<a href="' . esc_url($spam_uri) . '" title="' . esc_attr__('Mark this topic as spam', 'bbpress') . '">' . esc_html__('Spam', 'bbpress') . '</a>'; } } // Do not show trash links for spam topics, or spam links for trashed topics if (current_user_can('delete_topic', $topic->ID)) { if (bbp_get_trash_status_id() === $topic->post_status) { $post_type_object = get_post_type_object(bbp_get_topic_post_type()); $actions['untrash'] = "<a title='" . esc_attr__('Restore this item from the Trash', 'bbpress') . "' href='" . wp_nonce_url(add_query_arg(array('_wp_http_referer' => add_query_arg(array('post_type' => bbp_get_topic_post_type()), admin_url('edit.php'))), admin_url(sprintf($post_type_object->_edit_link . '&action=untrash', $topic->ID))), 'untrash-' . $topic->post_type . '_' . $topic->ID) . "'>" . esc_html__('Restore', 'bbpress') . "</a>"; } elseif (EMPTY_TRASH_DAYS) { $actions['trash'] = "<a class='submitdelete' title='" . esc_attr__('Move this item to the Trash', 'bbpress') . "' href='" . esc_url(add_query_arg(array('_wp_http_referer' => add_query_arg(array('post_type' => bbp_get_topic_post_type()), admin_url('edit.php'))), get_delete_post_link($topic->ID))) . "'>" . esc_html__('Trash', 'bbpress') . "</a>"; } if (bbp_get_trash_status_id() === $topic->post_status || !EMPTY_TRASH_DAYS) { $actions['delete'] = "<a class='submitdelete' title='" . esc_attr__('Delete this item permanently', 'bbpress') . "' href='" . esc_url(add_query_arg(array('_wp_http_referer' => add_query_arg(array('post_type' => bbp_get_topic_post_type()), admin_url('edit.php'))), get_delete_post_link($topic->ID, '', true))) . "'>" . esc_html__('Delete Permanently', 'bbpress') . "</a>"; } elseif (bbp_get_spam_status_id() === $topic->post_status) { unset($actions['trash']); } } return $actions; }
/** * Handles the front end opening/closing, spamming/unspamming, * sticking/unsticking and trashing/untrashing/deleting of topics * * @since 2.0.0 bbPress (r2727) * * @param string $action The requested action to compare this function to * @uses bbp_get_topic() To get the topic * @uses current_user_can() To check if the user is capable of editing or * deleting the topic * @uses bbp_get_topic_post_type() To get the topic post type * @uses check_ajax_referer() To verify the nonce and check the referer * @uses bbp_is_topic_open() To check if the topic is open * @uses bbp_close_topic() To close the topic * @uses bbp_open_topic() To open the topic * @uses bbp_is_topic_sticky() To check if the topic is a sticky * @uses bbp_unstick_topic() To unstick the topic * @uses bbp_stick_topic() To stick the topic * @uses bbp_is_topic_spam() To check if the topic is marked as spam * @uses bbp_spam_topic() To make the topic as spam * @uses bbp_unspam_topic() To unmark the topic as spam * @uses wp_trash_post() To trash the topic * @uses wp_untrash_post() To untrash the topic * @uses wp_delete_post() To delete the topic * @uses do_action() Calls 'bbp_toggle_topic_handler' with success, post data * and action * @uses bbp_get_forum_permalink() To get the forum link * @uses bbp_get_topic_permalink() To get the topic link * @uses bbp_redirect() To redirect to the topic * @uses bbPress::errors:add() To log the error messages */ function bbp_toggle_topic_handler($action = '') { // Bail if required GET actions aren't passed if (empty($_GET['topic_id'])) { return; } // Setup possible get actions $possible_actions = array('bbp_toggle_topic_close', 'bbp_toggle_topic_stick', 'bbp_toggle_topic_spam', 'bbp_toggle_topic_trash', 'bbp_toggle_topic_approve'); // Bail if actions aren't meant for this function if (!in_array($action, $possible_actions)) { return; } $failure = ''; // Empty failure string $view_all = false; // Assume not viewing all $topic_id = (int) $_GET['topic_id']; // What's the topic id? $success = false; // Flag $post_data = array('ID' => $topic_id); // Prelim array $redirect = ''; // Empty redirect URL // Make sure topic exists $topic = bbp_get_topic($topic_id); if (empty($topic)) { return; } // What is the user doing here? if (!current_user_can('edit_topic', $topic->ID) || 'bbp_toggle_topic_trash' === $action && !current_user_can('delete_topic', $topic->ID)) { bbp_add_error('bbp_toggle_topic_permission', __('<strong>ERROR:</strong> You do not have the permission to do that.', 'bbpress')); return; } // What action are we trying to perform? switch ($action) { // Toggle approve/unapprove case 'bbp_toggle_topic_approve': check_ajax_referer('approve-topic_' . $topic_id); $is_pending = bbp_is_topic_pending($topic_id); $success = true === $is_pending ? bbp_approve_topic($topic_id) : bbp_unapprove_topic($topic_id); $failure = true === $is_pending ? __('<strong>ERROR</strong>: There was a problem approving the topic.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem unapproving the topic.', 'bbpress'); break; // Toggle open/close // Toggle open/close case 'bbp_toggle_topic_close': check_ajax_referer('close-topic_' . $topic_id); $is_open = bbp_is_topic_open($topic_id); $success = true === $is_open ? bbp_close_topic($topic_id) : bbp_open_topic($topic_id); $failure = true === $is_open ? __('<strong>ERROR</strong>: There was a problem closing the topic.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem opening the topic.', 'bbpress'); break; // Toggle sticky/super-sticky/unstick // Toggle sticky/super-sticky/unstick case 'bbp_toggle_topic_stick': check_ajax_referer('stick-topic_' . $topic_id); $is_sticky = bbp_is_topic_sticky($topic_id); $is_super = false === $is_sticky && !empty($_GET['super']) && "1" === $_GET['super'] ? true : false; $success = true === $is_sticky ? bbp_unstick_topic($topic_id) : bbp_stick_topic($topic_id, $is_super); $failure = true === $is_sticky ? __('<strong>ERROR</strong>: There was a problem unsticking the topic.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem sticking the topic.', 'bbpress'); break; // Toggle spam // Toggle spam case 'bbp_toggle_topic_spam': check_ajax_referer('spam-topic_' . $topic_id); $is_spam = bbp_is_topic_spam($topic_id); $success = true === $is_spam ? bbp_unspam_topic($topic_id) : bbp_spam_topic($topic_id); $failure = true === $is_spam ? __('<strong>ERROR</strong>: There was a problem unmarking the topic as spam.', 'bbpress') : __('<strong>ERROR</strong>: There was a problem marking the topic as spam.', 'bbpress'); $view_all = !$is_spam; break; // Toggle trash // Toggle trash case 'bbp_toggle_topic_trash': $sub_action = !empty($_GET['sub_action']) && in_array($_GET['sub_action'], array('trash', 'untrash', 'delete')) ? $_GET['sub_action'] : false; if (empty($sub_action)) { break; } switch ($sub_action) { case 'trash': check_ajax_referer('trash-' . bbp_get_topic_post_type() . '_' . $topic_id); $view_all = true; $success = wp_trash_post($topic_id); $failure = __('<strong>ERROR</strong>: There was a problem trashing the topic.', 'bbpress'); break; case 'untrash': check_ajax_referer('untrash-' . bbp_get_topic_post_type() . '_' . $topic_id); $success = wp_untrash_post($topic_id); $failure = __('<strong>ERROR</strong>: There was a problem untrashing the topic.', 'bbpress'); break; case 'delete': check_ajax_referer('delete-' . bbp_get_topic_post_type() . '_' . $topic_id); $success = wp_delete_post($topic_id); $failure = __('<strong>ERROR</strong>: There was a problem deleting the topic.', 'bbpress'); break; } break; } // Do additional topic toggle actions do_action('bbp_toggle_topic_handler', $success, $post_data, $action); // No errors if (false !== $success && !is_wp_error($success)) { // Redirect back to the topic's forum if (isset($sub_action) && 'delete' === $sub_action) { $redirect = bbp_get_forum_permalink($success->post_parent); // Redirect back to the topic } else { // Get the redirect detination $permalink = bbp_get_topic_permalink($topic_id); $redirect = bbp_add_view_all($permalink, $view_all); } bbp_redirect($redirect); // Handle errors } else { bbp_add_error('bbp_toggle_topic', $failure); } }