Skip to:
Content

bbPress.org

Changeset 6133


Ignore:
Timestamp:
12/08/2016 02:23:07 PM (7 years ago)
Author:
johnjamesjacoby
Message:

Moderation: First pass at improved reply toggle actions:

  • Allow custom toggles, or replacement of existing toggles with new procedures
  • Introduce a handful of actions & filters to enable the above
  • Separate functionality into smaller, more manageable parts.

See #3032. (Forums & Topics @todo)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/includes/replies/functions.php

    r6036 r6133  
    16161616    }
    16171617
    1618     // Setup possible get actions
    1619     $possible_actions = array(
    1620         'bbp_toggle_reply_spam',
    1621         'bbp_toggle_reply_trash',
    1622         'bbp_toggle_reply_approve'
    1623     );
     1618    // Get possible reply-handler actions
     1619    $possible_actions = bbp_get_reply_handler_actions();
    16241620
    16251621    // Bail if actions aren't meant for this function
    1626     if ( ! in_array( $action, $possible_actions ) ) {
     1622    if ( ! in_array( $action, $possible_actions, true ) ) {
    16271623        return;
    16281624    }
    16291625
    1630     $failure   = '';                         // Empty failure string
    1631     $view_all  = false;                      // Assume not viewing all
    16321626    $reply_id  = (int) $_GET['reply_id'];    // What's the reply id?
    1633     $success   = false;                      // Flag
    16341627    $post_data = array( 'ID' => $reply_id ); // Prelim array
    16351628
     
    16411634
    16421635    // What is the user doing here?
    1643     if ( !current_user_can( 'edit_reply', $reply->ID ) || ( 'bbp_toggle_reply_trash' === $action && !current_user_can( 'delete_reply', $reply->ID ) ) ) {
     1636    if ( ! current_user_can( 'edit_reply', $reply->ID ) || ( 'bbp_toggle_reply_trash' === $action && ! current_user_can( 'delete_reply', $reply->ID ) ) ) {
    16441637        bbp_add_error( 'bbp_toggle_reply_permission', __( '<strong>ERROR:</strong> You do not have the permission to do that!', 'bbpress' ) );
    16451638        return;
    16461639    }
    16471640
     1641    // Do the reply toggling
     1642    $retval = bbp_toggle_reply( array(
     1643        'id'     => $reply_id,
     1644        'action' => $action,
     1645        'data'   => $post_data
     1646    ) );
     1647
     1648    // Do additional reply toggle actions
     1649    do_action( 'bbp_toggle_reply_handler', $retval['status'], $post_data, $action );
     1650
     1651    // Redirect back to reply
     1652    if ( ( false !== $retval['status'] ) && ! is_wp_error( $retval['status'] ) ) {
     1653        bbp_redirect( $retval['redirect_to'] );
     1654
     1655    // Handle errors
     1656    } else {
     1657        bbp_add_error( 'bbp_toggle_reply', $retval['message'] );
     1658    }
     1659}
     1660
     1661/**
     1662 * Do the actual reply toggling
     1663 *
     1664 * This function is used by `bbp_toggle_reply_handler()` to do the actual heavy
     1665 * lifting when it comes to toggling replies. It only really makes sense to call
     1666 * within that context, so if you need to call this function directly, make sure
     1667 * you're also doing what the handler does too.
     1668 *
     1669 * @since 2.6.0
     1670 * @access private
     1671 *
     1672 * @param array $args
     1673 */
     1674function bbp_toggle_reply( $args = array() ) {
     1675
     1676    // Parse the arguments
     1677    $r = bbp_parse_args( $args, array(
     1678        'id'     => 0,
     1679        'action' => '',
     1680        'data'   => array()
     1681    ) );
     1682
     1683    // Build the nonce suffix
     1684    $nonce_suffix = bbp_get_reply_post_type() . '_' . (int) $r['id'];
     1685
     1686    // Default return values
     1687    $retval = array(
     1688        'status'      => 0,
     1689        'message'     => '',
     1690        'redirect_to' => bbp_get_reply_url( $r['id'], bbp_get_redirect_to() ),
     1691        'view_all'    => false
     1692    );
     1693
    16481694    // What action are we trying to perform?
    1649     switch ( $action ) {
     1695    switch ( $r['action'] ) {
    16501696
    16511697        // Toggle approve
    16521698        case 'bbp_toggle_reply_approve' :
    1653             check_ajax_referer( 'approve-reply_' . $reply_id );
    1654 
    1655             $is_approve = bbp_is_reply_pending( $reply_id );
    1656             $success    = $is_approve ? bbp_approve_reply( $reply_id ) : bbp_unapprove_reply( $reply_id );
    1657             $failure    = $is_approve ? __( '<strong>ERROR</strong>: There was a problem approving the reply!', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem unapproving the reply!', 'bbpress' );
    1658             $view_all  = ! $is_approve;
     1699            check_ajax_referer( "approve-{$nonce_suffix}" );
     1700
     1701            $is_approve         = bbp_is_reply_pending( $r['id'] );
     1702            $retval['status']   = $is_approve ? bbp_approve_reply( $r['id'] ) : bbp_unapprove_reply( $r['id'] );
     1703            $retval['message']  = $is_approve ? __( '<strong>ERROR</strong>: There was a problem approving the reply!', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem unapproving the reply!', 'bbpress' );
     1704            $retval['view_all'] = ! $is_approve;
    16591705
    16601706            break;
     
    16621708        // Toggle spam
    16631709        case 'bbp_toggle_reply_spam' :
    1664             check_ajax_referer( 'spam-reply_' . $reply_id );
    1665 
    1666             $is_spam  = bbp_is_reply_spam( $reply_id );
    1667             $success  = $is_spam ? bbp_unspam_reply( $reply_id ) : bbp_spam_reply( $reply_id );
    1668             $failure  = $is_spam ? __( '<strong>ERROR</strong>: There was a problem unmarking the reply as spam!', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem marking the reply as spam!', 'bbpress' );
    1669             $view_all = ! $is_spam;
     1710            check_ajax_referer( "spam-{$nonce_suffix}" );
     1711
     1712            $is_spam            = bbp_is_reply_spam( $r['id'] );
     1713            $retval['status']   = $is_spam ? bbp_unspam_reply( $r['id'] ) : bbp_spam_reply( $r['id'] );
     1714            $retval['message']  = $is_spam ? __( '<strong>ERROR</strong>: There was a problem unmarking the reply as spam!', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem marking the reply as spam!', 'bbpress' );
     1715            $retval['view_all'] = ! $is_spam;
    16701716
    16711717            break;
     
    16741720        case 'bbp_toggle_reply_trash' :
    16751721
    1676             $sub_action = in_array( $_GET['sub_action'], array( 'trash', 'untrash', 'delete' ) ) ? $_GET['sub_action'] : false;
    1677 
     1722            // Subaction?
     1723            $sub_action = in_array( $_GET['sub_action'], array( 'trash', 'untrash', 'delete' ), true )
     1724                ? $_GET['sub_action']
     1725                : false;
     1726
     1727            // Bail if no subaction
    16781728            if ( empty( $sub_action ) ) {
    16791729                break;
    16801730            }
    16811731
     1732            // Which subaction?
    16821733            switch ( $sub_action ) {
    16831734                case 'trash':
    1684                     check_ajax_referer( 'trash-' . bbp_get_reply_post_type() . '_' . $reply_id );
    1685 
    1686                     $view_all = true;
    1687                     $success  = wp_trash_post( $reply_id );
    1688                     $failure  = __( '<strong>ERROR</strong>: There was a problem trashing the reply!', 'bbpress' );
     1735                    check_ajax_referer( "trash-{$nonce_suffix}" );
     1736
     1737                    $retval['view_all'] = true;
     1738                    $retval['status']   = wp_trash_post( $r['id'] );
     1739                    $retval['message']  = __( '<strong>ERROR</strong>: There was a problem trashing the reply!', 'bbpress' );
    16891740
    16901741                    break;
    16911742
    16921743                case 'untrash':
    1693                     check_ajax_referer( 'untrash-' . bbp_get_reply_post_type() . '_' . $reply_id );
    1694 
    1695                     $success = wp_untrash_post( $reply_id );
    1696                     $failure = __( '<strong>ERROR</strong>: There was a problem untrashing the reply!', 'bbpress' );
     1744                    check_ajax_referer( "untrash-{$nonce_suffix}" );
     1745
     1746                    $retval['status']  = wp_untrash_post( $r['id'] );
     1747                    $retval['message'] = __( '<strong>ERROR</strong>: There was a problem untrashing the reply!', 'bbpress' );
    16971748
    16981749                    break;
    16991750
    17001751                case 'delete':
    1701                     check_ajax_referer( 'delete-' . bbp_get_reply_post_type() . '_' . $reply_id );
    1702 
    1703                     $success = wp_delete_post( $reply_id );
    1704                     $failure = __( '<strong>ERROR</strong>: There was a problem deleting the reply!', 'bbpress' );
     1752                    check_ajax_referer( "delete-{$nonce_suffix}" );
     1753
     1754                    $retval['status']  = wp_delete_post( $r['id'] );
     1755                    $retval['message'] = __( '<strong>ERROR</strong>: There was a problem deleting the reply!', 'bbpress' );
    17051756
    17061757                    break;
     
    17101761    }
    17111762
    1712     // Do additional reply toggle actions
    1713     do_action( 'bbp_toggle_reply_handler', $success, $post_data, $action );
    1714 
    1715     // No errors
    1716     if ( ( false !== $success ) && !is_wp_error( $success ) ) {
    1717 
    1718         /** Redirect **********************************************************/
    1719 
    1720         // Redirect to
    1721         $redirect_to = bbp_get_redirect_to();
    1722 
    1723         // Get the reply URL
    1724         $reply_url = bbp_get_reply_url( $reply_id, $redirect_to );
    1725 
    1726         // Add view all if needed
    1727         if ( ! empty( $view_all ) ) {
    1728             $reply_url = bbp_add_view_all( $reply_url, true );
    1729         }
    1730 
    1731         // Redirect back to reply
    1732         bbp_redirect( $reply_url );
    1733 
    1734     // Handle errors
    1735     } else {
    1736         bbp_add_error( 'bbp_toggle_reply', $failure );
    1737     }
     1763    // Add view all if needed
     1764    if ( ! empty( $retval['view_all'] ) ) {
     1765        $retval['redirect_to'] = bbp_add_view_all( $retval['redirect_to'], true );
     1766    }
     1767
     1768    // Filter & return
     1769    return apply_filters( 'bbp_do_toggle_reply_handler', $retval, $r, $args );
    17381770}
    17391771
     
    17561788        bbp_get_pending_status_id() => _x( 'Pending', 'Mark reply as pending', 'bbpress' ),
    17571789    ), $reply_id );
     1790}
     1791
     1792/**
     1793 * Return array of available reply handler actions
     1794 *
     1795 * @since 2.6.0 bbPress (rxxxx)
     1796 */
     1797function bbp_get_reply_handler_actions() {
     1798    return apply_filters( 'bbp_get_reply_handler_actions', array(
     1799        'bbp_toggle_reply_spam',
     1800        'bbp_toggle_reply_trash',
     1801        'bbp_toggle_reply_approve'
     1802    ) );
    17581803}
    17591804
Note: See TracChangeset for help on using the changeset viewer.