Skip to:
Content

bbPress.org

Changeset 6723


Ignore:
Timestamp:
10/10/2017 08:40:08 PM (6 years ago)
Author:
johnjamesjacoby
Message:

Engagements: abstract meta strategy into an overload'able class.

This change introduces a class and wrapper function to allow the meta strategy of the new user engagements API to be hot-swapped. This might be helpful on large installations where a dedicated database table makes more sense, or for integrations where features like "Favorites" or "Subscriptions" might already be delegated to other third-party membership plugins. Now, the caller class can be filtered to one that includes custom methods.

See #3068.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bbpress.php

    r6705 r6723  
    298298        $this->extend         = new stdClass(); // Plugins add data here
    299299        $this->errors         = new WP_Error(); // Feedback
     300
     301        /** Engagements *******************************************************/
     302
     303        $this->engagements    = new BBP_User_Engagements_Meta(); // Meta strategy interface
    300304
    301305        /** Deprecated ********************************************************/
  • trunk/src/includes/core/abstraction.php

    r6680 r6723  
    334334    return (int) apply_filters( 'bbp_get_total_users', (int) $count );
    335335}
     336
     337/** Engagements ***************************************************************/
     338
     339/**
     340 * Return the strategy used for storing user engagements
     341 *
     342 * @since 2.6.0 bbPress (r6722)
     343 *
     344 * @return string
     345 */
     346function bbp_user_engagements_interface() {
     347    return apply_filters( 'bbp_user_engagements_interface', bbpress()->engagements );
     348}
     349
     350/**
     351 * Meta strategy for interfacing with User Engagements
     352 *
     353 * @since 2.6.0 bbPress (r6722)
     354 */
     355class BBP_User_Engagements_Meta {
     356
     357    /**
     358     * Add a user id to an object
     359     *
     360     * @since 2.6.0 bbPress (r6722)
     361     *
     362     * @param int    $object_id The object id
     363     * @param int    $user_id   The user id
     364     * @param string $meta_key  The relationship key
     365     * @param string $meta_type The relationship type (usually 'post')
     366     * @param bool   $unique    Whether meta key should be unique to the object
     367     *
     368     * @return bool Returns true on success, false on failure
     369     */
     370    public function add_user_to_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post', $unique = false ) {
     371        return add_metadata( $meta_type, $object_id, $meta_key, $user_id, $unique );
     372    }
     373
     374    /**
     375     * Remove a user id from an object
     376     *
     377     * @since 2.6.0 bbPress (r6722)
     378     *
     379     * @param int    $object_id The object id
     380     * @param int    $user_id   The user id
     381     * @param string $meta_key  The relationship key
     382     * @param string $meta_type The relationship type (usually 'post')
     383     *
     384     * @return bool Returns true on success, false on failure
     385     */
     386    public function remove_user_from_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
     387        return delete_metadata( $meta_type, $object_id, $meta_key, $user_id, false );
     388    }
     389
     390    /**
     391     * Remove a user id from all objects
     392     *
     393     * @since 2.6.0 bbPress (r6722)
     394     *
     395     * @param int    $user_id   The user id
     396     * @param string $meta_key  The relationship key
     397     * @param string $meta_type The relationship type (usually 'post')
     398     *
     399     * @return bool Returns true on success, false on failure
     400     */
     401    public function remove_user_from_all_objects( $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
     402        return delete_metadata( $meta_type, null, $meta_key, $user_id, true );
     403    }
     404
     405    /**
     406     * Remove an object from all users
     407     *
     408     * @since 2.6.0 bbPress (r6722)
     409     *
     410     * @param int    $object_id The object id
     411     * @param int    $user_id   The user id
     412     * @param string $meta_key  The relationship key
     413     * @param string $meta_type The relationship type (usually 'post')
     414     *
     415     * @return bool Returns true on success, false on failure
     416     */
     417    public function remove_object_from_all_users( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
     418        return delete_metadata( $meta_type, $object_id, $meta_key, null, false );
     419    }
     420
     421    /**
     422     * Remove all users from all objects
     423     *
     424     * @since 2.6.0 bbPress (r6722)
     425     *
     426     * @param string $meta_key  The relationship key
     427     * @param string $meta_type The relationship type (usually 'post')
     428     *
     429     * @return bool Returns true on success, false on failure
     430     */
     431    public function remove_all_users_from_all_objects( $meta_key = '', $meta_type = 'post' ) {
     432        return delete_metadata( $meta_type, null, $meta_key, null, true );
     433    }
     434
     435    /**
     436     * Get users of an object
     437     *
     438     * @since 2.6.0 bbPress (r6722)
     439     *
     440     * @param int    $object_id The object id
     441     * @param string $meta_key  The key used to index this relationship
     442     * @param string $meta_type The type of meta to look in
     443     *
     444     * @return array Returns ids of users
     445     */
     446    public function get_users_for_object( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
     447        return wp_parse_id_list( get_metadata( $meta_type, $object_id, $meta_key, false ) );
     448    }
     449}
  • trunk/src/includes/users/engagements.php

    r6619 r6723  
    2020 * @param int    $object_id The object id
    2121 * @param int    $user_id   The user id
    22  * @param string $meta_key  The relationship key
    23  * @param string $meta_type The relationship type (usually 'post')
     22 * @param string $rel_key   The relationship key
     23 * @param string $rel_type The relationship type (usually 'post')
    2424 * @param bool   $unique    Whether meta key should be unique to the object
    2525 *
    2626 * @return bool Returns true on success, false on failure
    2727 */
    28 function bbp_add_user_to_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post', $unique = false ) {
    29     $retval = add_metadata( $meta_type, $object_id, $meta_key, $user_id, $unique );
    30 
    31     // Filter & return
    32     return (bool) apply_filters( 'bbp_add_user_to_object', (bool) $retval, $object_id, $user_id, $meta_key, $meta_type, $unique );
     28function bbp_add_user_to_object( $object_id = 0, $user_id = 0, $rel_key = '', $rel_type = 'post', $unique = false ) {
     29    $retval = bbp_user_engagements_interface()->add_user_to_object( $object_id, $user_id, $rel_key, $rel_type, $unique );
     30
     31    // Filter & return
     32    return (bool) apply_filters( 'bbp_add_user_to_object', $retval, $object_id, $user_id, $rel_key, $rel_type, $unique );
    3333}
    3434
     
    4040 * @param int    $object_id The object id
    4141 * @param int    $user_id   The user id
    42  * @param string $meta_key  The relationship key
    43  * @param string $meta_type The relationship type (usually 'post')
     42 * @param string $rel_key   The relationship key
     43 * @param string $rel_type The relationship type (usually 'post')
    4444 *
    4545 * @return bool Returns true on success, false on failure
    4646 */
    47 function bbp_remove_user_from_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
    48     $retval = delete_metadata( $meta_type, $object_id, $meta_key, $user_id, false );
    49 
    50     // Filter & return
    51     return (bool) apply_filters( 'bbp_remove_user_from_object', (bool) $retval, $object_id, $user_id, $meta_key, $meta_type );
     47function bbp_remove_user_from_object( $object_id = 0, $user_id = 0, $rel_key = '', $rel_type = 'post' ) {
     48    $retval = bbp_user_engagements_interface()->remove_user_from_object( $object_id, $user_id, $rel_key, $rel_type );
     49
     50    // Filter & return
     51    return (bool) apply_filters( 'bbp_remove_user_from_object', $retval, $object_id, $user_id, $rel_key, $rel_type );
    5252}
    5353
     
    5757 * @since 2.6.0 bbPress (r6109)
    5858 *
    59  * @param int    $user_id   The user id
    60  * @param string $meta_key  The relationship key
    61  * @param string $meta_type The relationship type (usually 'post')
     59 * @param int    $user_id  The user id
     60 * @param string $rel_key  The relationship key
     61 * @param string $rel_type The relationship type (usually 'post')
    6262 *
    6363 * @return bool Returns true on success, false on failure
    6464 */
    65 function bbp_remove_user_from_all_objects( $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
    66     $retval = delete_metadata( $meta_type, null, $meta_key, $user_id, true );
    67 
    68     // Filter & return
    69     return (bool) apply_filters( 'bbp_remove_user_from_all_objects', (bool) $retval, $user_id, $meta_key, $meta_type );
     65function bbp_remove_user_from_all_objects( $user_id = 0, $rel_key = '', $rel_type = 'post' ) {
     66    $retval = bbp_user_engagements_interface()->remove_user_from_all_objects( $user_id, $rel_key, $rel_type );
     67
     68    // Filter & return
     69    return (bool) apply_filters( 'bbp_remove_user_from_all_objects', $retval, $user_id, $rel_key, $rel_type );
    7070}
    7171
     
    7777 * @param int    $object_id The object id
    7878 * @param int    $user_id   The user id
    79  * @param string $meta_key  The relationship key
    80  * @param string $meta_type The relationship type (usually 'post')
     79 * @param string $rel_key   The relationship key
     80 * @param string $rel_type The relationship type (usually 'post')
    8181 *
    8282 * @return bool Returns true on success, false on failure
    8383 */
    84 function bbp_remove_object_from_all_users( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
    85     $retval = delete_metadata( $meta_type, $object_id, $meta_key, null, false );
    86 
    87     // Filter & return
    88     return (bool) apply_filters( 'bbp_remove_object_from_all_users', (bool) $retval, $object_id, $meta_key, $meta_type );
     84function bbp_remove_object_from_all_users( $object_id = 0, $rel_key = '', $rel_type = 'post' ) {
     85    $retval = bbp_user_engagements_interface()->remove_object_from_all_users( $object_id, $rel_key, $rel_type );
     86
     87    // Filter & return
     88    return (bool) apply_filters( 'bbp_remove_object_from_all_users', $retval, $object_id, $rel_key, $rel_type );
    8989}
    9090
     
    9494 * @since 2.6.0 bbPress (r6109)
    9595 *
    96  * @param string $meta_key  The relationship key
    97  * @param string $meta_type The relationship type (usually 'post')
     96 * @param string $rel_key  The relationship key
     97 * @param string $rel_type The relationship type (usually 'post')
    9898 *
    9999 * @return bool Returns true on success, false on failure
    100100 */
    101 function bbp_remove_all_users_from_all_objects( $meta_key = '', $meta_type = 'post' ) {
    102     $retval = delete_metadata( $meta_type, null, $meta_key, null, true );
    103 
    104     // Filter & return
    105     return (bool) apply_filters( 'bbp_remove_all_users_from_all_objects', (bool) $retval, $meta_key, $meta_type );
     101function bbp_remove_all_users_from_all_objects( $rel_key = '', $rel_type = 'post' ) {
     102    $retval = bbp_user_engagements_interface()->remove_all_users_from_all_objects( $rel_key, $rel_type );
     103
     104    // Filter & return
     105    return (bool) apply_filters( 'bbp_remove_all_users_from_all_objects', $retval, $rel_key, $rel_type );
    106106}
    107107
     
    112112 *
    113113 * @param int    $object_id The object id
    114  * @param string $meta_key  The key used to index this relationship
    115  * @param string $meta_type The type of meta to look in
     114 * @param string $rel_key   The key used to index this relationship
     115 * @param string $rel_type The type of meta to look in
    116116 *
    117117 * @return array Returns ids of users
    118118 */
    119 function bbp_get_users_for_object( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
    120     $meta   = get_metadata( $meta_type, $object_id, $meta_key, false );
    121     $retval = wp_parse_id_list( $meta );
    122 
    123     // Filter & return
    124     return (array) apply_filters( 'bbp_get_users_for_object', $retval, $object_id, $meta_key, $meta_type );
     119function bbp_get_users_for_object( $object_id = 0, $rel_key = '', $rel_type = 'post' ) {
     120    $retval = bbp_user_engagements_interface()->get_users_for_object( $object_id, $rel_key, $rel_type );
     121
     122    // Filter & return
     123    return (array) apply_filters( 'bbp_get_users_for_object', $retval, $object_id, $rel_key, $rel_type );
    125124}
    126125
     
    132131 * @param int    $object_id The object id
    133132 * @param int    $user_id   The user id
    134  * @param string $meta_key  The relationship key
    135  * @param string $meta_type The relationship type (usually 'post')
     133 * @param string $rel_key   The relationship key
     134 * @param string $rel_type The relationship type (usually 'post')
    136135 *
    137136 * @return bool Returns true if object has a user, false if not
    138137 */
    139 function bbp_is_object_of_user( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
    140     $user_ids = bbp_get_users_for_object( $object_id, $meta_key, $meta_type );
     138function bbp_is_object_of_user( $object_id = 0, $user_id = 0, $rel_key = '', $rel_type = 'post' ) {
     139    $user_ids = bbp_get_users_for_object( $object_id, $rel_key, $rel_type );
    141140    $retval   = is_numeric( array_search( $user_id, $user_ids, true ) );
    142141
    143142    // Filter & return
    144     return (bool) apply_filters( 'bbp_is_object_of_user', $retval, $object_id, $user_id, $meta_key, $meta_type );
     143    return (bool) apply_filters( 'bbp_is_object_of_user', $retval, $object_id, $user_id, $rel_key, $rel_type );
    145144}
    146145
     
    981980
    982981/**
     982 * These functions are no longer used in bbPress due to general performance
     983 * concerns on large installations. They are provided here for convenience and
     984 * backwards compatibility only.
     985 */
     986
     987/**
    983988 * Get a user's object IDs
    984989 *
     
    991996 *
    992997 * @param int    $user_id   The user id
    993  * @param string $meta_key  The relationship key
    994  * @param string $meta_type The relationship type (usually 'post')
     998 * @param string $rel_key   The relationship key
     999 * @param string $rel_type The relationship type (usually 'post')
    9951000 * @param array  $args      The arguments to override defaults
    9961001 *
     
    10041009        'user_id'     => 0,
    10051010        'object_type' => bbp_get_topic_post_type(),
    1006         'meta_key'    => '',
    1007         'meta_type'   => 'post',
     1011        'rel_key'     => '',
     1012        'rel_type'    => 'post',
    10081013        'filter'      => 'user_object_ids',
    10091014        'args'        => array()
     
    10121017    // Sanitize arguments
    10131018    $r['user_id']     = bbp_get_user_id( $r['user_id'] );
    1014     $r['meta_key']    = sanitize_key( $r['meta_key'] );
    1015     $r['meta_type']   = sanitize_key( $r['meta_type'] );
     1019    $r['rel_key']     = sanitize_key( $r['rel_key'] );
     1020    $r['rel_type']    = sanitize_key( $r['rel_type'] );
    10161021    $r['object_type'] = sanitize_key( $r['object_type'] );
    10171022    $r['filter']      = sanitize_key( $r['filter'] );
    10181023
    10191024    // Defaults
    1020     if ( 'post' === $r['meta_type'] ) {
     1025    if ( 'post' === $r['rel_type'] ) {
    10211026        $defaults = array(
    10221027            'fields'         => 'ids',
     
    10241029            'posts_per_page' => -1,
    10251030            'meta_query'     => array( array(
    1026                 'key'     => $r['meta_key'],
     1031                'key'     => $r['rel_key'],
    10271032                'value'   => $r['user_id'],
    10281033                'compare' => 'NUMERIC'
     
    10431048
    10441049    // Queries
    1045     if ( 'post' === $r['meta_type'] ) {
     1050    if ( 'post' === $r['rel_type'] ) {
    10461051        $query      = new WP_Query( $query_args );
    10471052        $object_ids = $query->posts;
     
    10641069    return bbp_get_user_object_ids( array(
    10651070        'user_id'     => $user_id,
    1066         'meta_key'    => '_bbp_moderator_id',
     1071        'rel_key'     => '_bbp_moderator_id',
    10671072        'object_type' => bbp_get_forum_post_type(),
    10681073        'filter'      => 'moderator_forum_ids'
     
    10811086function bbp_get_user_engaged_topic_ids( $user_id = 0 ) {
    10821087    return bbp_get_user_object_ids( array(
    1083         'user_id'  => $user_id,
    1084         'meta_key' => '_bbp_engagement',
    1085         'filter'   => 'user_engaged_topic_ids'
     1088        'user_id' => $user_id,
     1089        'rel_key' => '_bbp_engagement',
     1090        'filter'  => 'user_engaged_topic_ids'
    10861091    ) );
    10871092}
     
    10941099 * @param int $user_id Optional. User id
    10951100 *
    1096  * @return array Return array of favorited ids, or empty array
     1101 * @return array Return array of favorite topic ids, or empty array
    10971102 */
    10981103function bbp_get_user_favorites_topic_ids( $user_id = 0 ) {
    10991104    return bbp_get_user_object_ids( array(
    1100         'user_id'  => $user_id,
    1101         'meta_key' => '_bbp_favorite',
    1102         'filter'   => 'user_favorites_topic_ids'
     1105        'user_id' => $user_id,
     1106        'rel_key' => '_bbp_favorite',
     1107        'filter'  => 'user_favorites_topic_ids'
    11031108    ) );
    11041109}
     
    11111116 * @param int $user_id Optional. User id
    11121117 *
    1113  * @return array Return array of subscribed ids, or empty array
     1118 * @return array Return array of subscribed forum ids, or empty array
    11141119 */
    11151120function bbp_get_user_subscribed_forum_ids( $user_id = 0 ) {
    11161121    return bbp_get_user_object_ids( array(
    11171122        'user_id'     => $user_id,
    1118         'meta_key'    => '_bbp_subscription',
     1123        'rel_key'     => '_bbp_subscription',
    11191124        'object_type' => bbp_get_forum_post_type(),
    11201125        'filter'      => 'user_subscribed_forum_ids'
     
    11291134 * @param int $user_id Optional. User id
    11301135 *
    1131  * @return array Return array of subscribed ids, or empty array
     1136 * @return array Return array of subscribed topic ids, or empty array
    11321137 */
    11331138function bbp_get_user_subscribed_topic_ids( $user_id = 0 ) {
    11341139    return bbp_get_user_object_ids( array(
    1135         'user_id'  => $user_id,
    1136         'meta_key' => '_bbp_subscription',
    1137         'filter'   => 'user_subscribed_topic_ids'
     1140        'user_id' => $user_id,
     1141        'rel_key' => '_bbp_subscription',
     1142        'filter'  => 'user_subscribed_topic_ids'
    11381143    ) );
    11391144}
Note: See TracChangeset for help on using the changeset viewer.