Skip to:
Content

Changeset 6739


Ignore:
Timestamp:
11/17/2017 08:12:24 PM (8 months ago)
Author:
johnjamesjacoby
Message:

Engagements: include BBP_User_Engagements_Term class, as term storage example.

This change includes an alternative storage mechanism for engagements. Meta is used by default, but using Taxonomies and Terms for storage instead may be more appealing to certain installation types.

A few related functions were updated to use newer abstractions. See #459.

Location:
trunk/src/includes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/includes/core/abstraction.php

    r6734 r6739  
    385385 * @since 2.6.0 bbPress (r6722)
    386386 */
    387 class BBP_User_Engagements_Meta {
     387class BBP_User_Engagements_Base {
     388
     389    /**
     390     *
     391     * @since 2.6.0 bbPress (r6737)
     392     *
     393     * @var string
     394     */
     395    public $type = '';
     396
     397    /**
     398     * Add a user id to an object
     399     *
     400     * @since 2.6.0 bbPress (r6722)
     401     *
     402     * @param int    $object_id The object id
     403     * @param int    $user_id   The user id
     404     * @param string $meta_key  The relationship key
     405     * @param string $meta_type The relationship type (usually 'post')
     406     * @param bool   $unique    Whether meta key should be unique to the object
     407     *
     408     * @return bool Returns true on success, false on failure
     409     */
     410    public function add_user_to_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post', $unique = false ) {
     411
     412    }
     413
     414    /**
     415     * Remove a user id from an object
     416     *
     417     * @since 2.6.0 bbPress (r6722)
     418     *
     419     * @param int    $object_id The object id
     420     * @param int    $user_id   The user id
     421     * @param string $meta_key  The relationship key
     422     * @param string $meta_type The relationship type (usually 'post')
     423     *
     424     * @return bool Returns true on success, false on failure
     425     */
     426    public function remove_user_from_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
     427
     428    }
     429
     430    /**
     431     * Remove a user id from all objects
     432     *
     433     * @since 2.6.0 bbPress (r6722)
     434     *
     435     * @param int    $user_id   The user id
     436     * @param string $meta_key  The relationship key
     437     * @param string $meta_type The relationship type (usually 'post')
     438     *
     439     * @return bool Returns true on success, false on failure
     440     */
     441    public function remove_user_from_all_objects( $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
     442
     443    }
     444
     445    /**
     446     * Remove an object from all users
     447     *
     448     * @since 2.6.0 bbPress (r6722)
     449     *
     450     * @param int    $object_id The object id
     451     * @param int    $user_id   The user id
     452     * @param string $meta_key  The relationship key
     453     * @param string $meta_type The relationship type (usually 'post')
     454     *
     455     * @return bool Returns true on success, false on failure
     456     */
     457    public function remove_object_from_all_users( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
     458
     459    }
     460
     461    /**
     462     * Remove all users from all objects
     463     *
     464     * @since 2.6.0 bbPress (r6722)
     465     *
     466     * @param string $meta_key  The relationship key
     467     * @param string $meta_type The relationship type (usually 'post')
     468     *
     469     * @return bool Returns true on success, false on failure
     470     */
     471    public function remove_all_users_from_all_objects( $meta_key = '', $meta_type = 'post' ) {
     472
     473    }
     474
     475    /**
     476     * Get users of an object
     477     *
     478     * @since 2.6.0 bbPress (r6722)
     479     *
     480     * @param int    $object_id The object id
     481     * @param string $meta_key  The key used to index this relationship
     482     * @param string $meta_type The type of meta to look in
     483     *
     484     * @return array Returns ids of users
     485     */
     486    public function get_users_for_object( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
     487
     488    }
     489
     490    /**
     491     * Get the part of the query responsible for JOINing objects to relationships.
     492     *
     493     * @since 2.6.0 bbPress (r6737)
     494     *
     495     * @param array  $args
     496     * @param string $meta_key
     497     * @param string $meta_type
     498     *
     499     * @return array
     500     */
     501    public function get_query( $args = array(), $context_key = '', $meta_key = '', $meta_type = 'post' ) {
     502
     503    }
     504}
     505
     506/**
     507 * Meta strategy for interfacing with User Engagements
     508 *
     509 * @since 2.6.0 bbPress (r6722)
     510 */
     511class BBP_User_Engagements_Meta extends BBP_User_Engagements_Base {
     512
     513    /**
     514     *
     515     * @since 2.6.0 bbPress (r6737)
     516     *
     517     * @var string
     518     */
     519    public $type = 'meta';
    388520
    389521    /**
     
    479611        return wp_parse_id_list( get_metadata( $meta_type, $object_id, $meta_key, false ) );
    480612    }
    481 }
     613
     614    /**
     615     * Get the part of the query responsible for JOINing objects to relationships.
     616     *
     617     * @since 2.6.0 bbPress (r6737)
     618     *
     619     * @param array  $args
     620     * @param string $meta_key
     621     * @param string $meta_type
     622     *
     623     * @return array
     624     */
     625    public function get_query( $args = array(), $context_key = '', $meta_key = '', $meta_type = 'post' ) {
     626
     627        // Backwards compat for pre-2.6.0
     628        if ( is_numeric( $args ) ) {
     629            $args = array(
     630                'meta_query' => array( array(
     631                    'key'     => $meta_key,
     632                    'value'   => bbp_get_user_id( $args, false, false ),
     633                    'compare' => 'NUMERIC'
     634                ) )
     635            );
     636        }
     637
     638        // Default arguments
     639        $defaults = array(
     640            'meta_query' => array( array(
     641                'key'     => $meta_key,
     642                'value'   => bbp_get_displayed_user_id(),
     643                'compare' => 'NUMERIC'
     644            ) )
     645        );
     646
     647        // Parse arguments
     648        return bbp_parse_args( $args, $defaults, $context_key );
     649    }
     650}
     651
     652/**
     653 * Term strategy for interfacing with User Engagements
     654 *
     655 * @since 2.6.0 bbPress (r6737)
     656 */
     657class BBP_User_Engagements_Term extends BBP_User_Engagements_Base {
     658
     659    /**
     660     * Term type
     661     *
     662     * @since 2.6.0 bbPress (r6737)
     663     *
     664     * @var string
     665     */
     666    public $type = 'term';
     667
     668    /**
     669     * Register an engagement taxonomy just-in-time
     670     *
     671     * @since 2.6.0 bbPress (r6737)
     672     *
     673     * @param string $tax_key
     674     * @param string $object_type
     675     */
     676    private function jit_taxonomy( $tax_key = '', $object_type = 'user' ) {
     677
     678        // Bail if taxonomy already exists
     679        if ( taxonomy_exists( $tax_key ) ) {
     680            return;
     681        }
     682
     683        // Register the taxonomy
     684        register_taxonomy( $tax_key, 'bbp_' . $object_type, array(
     685            'labels'                => array(),
     686            'description'           => '',
     687            'public'                => false,
     688            'publicly_queryable'    => false,
     689            'hierarchical'          => false,
     690            'show_ui'               => false,
     691            'show_in_menu'          => false,
     692            'show_in_nav_menus'     => false,
     693            'show_tagcloud'         => false,
     694            'show_in_quick_edit'    => false,
     695            'show_admin_column'     => false,
     696            'meta_box_cb'           => false,
     697            'capabilities'          => array(),
     698            'rewrite'               => false,
     699            'query_var'             => '',
     700            'update_count_callback' => '',
     701            'show_in_rest'          => false,
     702            'rest_base'             => false,
     703            'rest_controller_class' => false,
     704            '_builtin'              => false
     705        ) );
     706    }
     707
     708    /**
     709     * Add a user id to an object
     710     *
     711     * @since 2.6.0 bbPress (r6737)
     712     *
     713     * @param int    $object_id The object id
     714     * @param int    $user_id   The user id
     715     * @param string $meta_key  The relationship key
     716     * @param string $meta_type The relationship type (usually 'post')
     717     * @param bool   $unique    Whether meta key should be unique to the object
     718     *
     719     * @return bool Returns true on success, false on failure
     720     */
     721    public function add_user_to_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post', $unique = false ) {
     722        $user_key = "{$meta_key}_user_id_{$user_id}";
     723        $tax_key  = "{$meta_key}_{$meta_type}";
     724        $this->jit_taxonomy( $tax_key );
     725
     726        return wp_add_object_terms( $object_id, $user_key, $tax_key );
     727    }
     728
     729    /**
     730     * Remove a user id from an object
     731     *
     732     * @since 2.6.0 bbPress (r6737)
     733     *
     734     * @param int    $object_id The object id
     735     * @param int    $user_id   The user id
     736     * @param string $meta_key  The relationship key
     737     * @param string $meta_type The relationship type (usually 'post')
     738     *
     739     * @return bool Returns true on success, false on failure
     740     */
     741    public function remove_user_from_object( $object_id = 0, $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
     742        $user_key = "{$meta_key}_user_id_{$user_id}";
     743        $tax_key  = "{$meta_key}_{$meta_type}";
     744        $this->jit_taxonomy( $tax_key );
     745
     746        return wp_remove_object_terms( $object_id, $user_key, $tax_key );
     747    }
     748
     749    /**
     750     * Remove a user id from all objects
     751     *
     752     * @since 2.6.0 bbPress (r6737)
     753     *
     754     * @param int    $user_id   The user id
     755     * @param string $meta_key  The relationship key
     756     * @param string $meta_type The relationship type (usually 'post')
     757     *
     758     * @return bool Returns true on success, false on failure
     759     */
     760    public function remove_user_from_all_objects( $user_id = 0, $meta_key = '', $meta_type = 'post' ) {
     761        $user_key = "{$meta_key}_user_id_{$user_id}";
     762        $tax_key  = "{$meta_key}_{$meta_type}";
     763        $this->jit_taxonomy( $tax_key );
     764        $term     = get_term_by( 'slug', $user_key, $tax_key );
     765
     766        return wp_delete_term( $term->term_id, $tax_key );
     767    }
     768
     769    /**
     770     * Remove an object from all users
     771     *
     772     * @since 2.6.0 bbPress (r6737)
     773     *
     774     * @param int    $object_id The object id
     775     * @param int    $user_id   The user id
     776     * @param string $meta_key  The relationship key
     777     * @param string $meta_type The relationship type (usually 'post')
     778     *
     779     * @return bool Returns true on success, false on failure
     780     */
     781    public function remove_object_from_all_users( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
     782        return wp_delete_object_term_relationships( $object_id, get_object_taxonomies( 'bbp_user' ) );
     783    }
     784
     785    /**
     786     * Remove all users from all objects
     787     *
     788     * @since 2.6.0 bbPress (r6737)
     789     *
     790     * @param string $meta_key  The relationship key
     791     * @param string $meta_type The relationship type (usually 'post')
     792     *
     793     * @return bool Returns true on success, false on failure
     794     */
     795    public function remove_all_users_from_all_objects( $meta_key = '', $meta_type = 'post' ) {
     796        // TODO
     797    }
     798
     799    /**
     800     * Get users of an object
     801     *
     802     * @since 2.6.0 bbPress (r6737)
     803     *
     804     * @param int    $object_id The object id
     805     * @param string $meta_key  The key used to index this relationship
     806     * @param string $meta_type The type of meta to look in
     807     *
     808     * @return array Returns ids of users
     809     */
     810    public function get_users_for_object( $object_id = 0, $meta_key = '', $meta_type = 'post' ) {
     811        $user_key = "{$meta_key}_user_id_";
     812        $tax_key  = "{$meta_key}_{$meta_type}";
     813        $this->jit_taxonomy( $tax_key );
     814
     815        // Get terms
     816        $terms = get_terms( array(
     817            'object_ids' => $object_id,
     818            'taxonomy'   => $tax_key
     819        ) );
     820
     821        // Slug part to replace
     822        $user_ids = array();
     823
     824        // Loop through terms and get the user ID
     825        foreach ( $terms as $term ) {
     826            $user_ids[] = str_replace( $user_key, '', $term->slug );
     827        }
     828
     829        // Parse & return
     830        return wp_parse_id_list( $user_ids );
     831    }
     832
     833    /**
     834     * Get the part of the query responsible for JOINing objects to relationships.
     835     *
     836     * @since 2.6.0 bbPress (r6737)
     837     *
     838     * @param array  $args
     839     * @param string $meta_key
     840     * @param string $meta_type
     841     *
     842     * @return array
     843     */
     844    public function get_query( $args = array(), $context_key = '', $meta_key = '', $meta_type = 'post' ) {
     845        $tax_key  = "{$meta_key}_{$meta_type}";
     846        $user_key = "{$meta_key}_user_id_";
     847
     848        // Make sure the taxonomy is registered
     849        $this->jit_taxonomy( $tax_key );
     850
     851        // Backwards compat for pre-2.6.0
     852        if ( is_numeric( $args ) ) {
     853            $args = array(
     854                'tax_query' => array( array(
     855                    'taxonomy' => $tax_key,
     856                    'terms'    => $user_key . bbp_get_user_id( $args, false, false ),
     857                    'field'    => 'slug'
     858                ) )
     859            );
     860        }
     861
     862        // Default arguments
     863        $defaults = array(
     864            'tax_query' => array( array(
     865                'taxonomy' => $tax_key,
     866                'terms'    => $user_key . bbp_get_displayed_user_id(),
     867                'field'    => 'slug'
     868            ) )
     869        );
     870
     871        // Parse arguments
     872        return bbp_parse_args( $args, $defaults, $context_key );
     873    }
     874}
  • trunk/src/includes/users/engagements.php

    r6723 r6739  
    142142    // Filter & return
    143143    return (bool) apply_filters( 'bbp_is_object_of_user', $retval, $object_id, $user_id, $rel_key, $rel_type );
     144}
     145
     146/**
     147 * Get the query part responsible for JOINing objects to user IDs
     148 *
     149 * @since 2.6.0 bbPress (r6747)
     150 *
     151 * @param array  $args
     152 * @param string $context
     153 * @param string $meta_key
     154 * @param string $meta_type
     155 *
     156 * @return array
     157 */
     158function bbp_get_user_object_query( $args = array(), $context = '', $meta_key = '', $meta_type = 'post' ) {
     159    $retval = bbp_user_engagements_interface()->get_query( $args, "get_user_{$context}", $meta_key, $meta_type );
     160
     161    // Filter & return
     162    return (array) apply_filters( 'bbp_get_user_object_query', $retval, $args, $context, $meta_key, $meta_type );
    144163}
    145164
     
    215234 */
    216235function bbp_get_user_engagements( $args = array() ) {
    217 
    218     // Backwards compat for pre-2.6.0
    219     if ( is_numeric( $args ) ) {
    220         $args = array(
    221             'meta_query' => array( array(
    222                 'key'     => '_bbp_engagement',
    223                 'value'   => bbp_get_user_id( $args, false, false ),
    224                 'compare' => 'NUMERIC'
    225             ) )
    226         );
    227     }
    228 
    229     // Default arguments
    230     $defaults = array(
    231         'meta_query' => array( array(
    232             'key'     => '_bbp_engagement',
    233             'value'   => bbp_get_displayed_user_id(),
    234             'compare' => 'NUMERIC'
    235         ) )
    236     );
    237 
    238     // Parse arguments
    239     $r = bbp_parse_args( $args, $defaults, 'get_user_engagements' );
    240 
    241     // Get the topics
    242     $query   = bbp_has_topics( $r );
    243     $user_id = isset( $r['meta_query'][0]['value'] )
    244         ? $r['meta_query'][0]['value']
    245         : 0;
    246 
    247     // Filter & return
    248     return apply_filters( 'bbp_get_user_engagements', $query, $user_id, $r, $args );
     236    $r     = bbp_get_user_object_query( $args, 'engagements', '_bbp_engagement' );
     237    $query = bbp_has_topics( $r );
     238
     239    // Filter & return
     240    return apply_filters( 'bbp_get_user_engagements', $query, 0, $r, $args );
    249241}
    250242
     
    465457 */
    466458function bbp_get_user_favorites( $args = array() ) {
    467 
    468     // Backwards compat for pre-2.6.0
    469     if ( is_numeric( $args ) ) {
    470         $args = array(
    471             'meta_query' => array( array(
    472                 'key'     => '_bbp_favorite',
    473                 'value'   => bbp_get_user_id( $args, false, false ),
    474                 'compare' => 'NUMERIC'
    475             ) )
    476         );
    477     }
    478 
    479     // Default arguments
    480     $defaults = array(
    481         'meta_query' => array( array(
    482             'key'     => '_bbp_favorite',
    483             'value'   => bbp_get_displayed_user_id(),
    484             'compare' => 'NUMERIC'
    485         ) )
    486     );
    487 
    488     // Parse arguments
    489     $r = bbp_parse_args( $args, $defaults, 'get_user_favorites' );
    490 
    491     // Get the topics
    492     $query   = bbp_has_topics( $r );
    493         $user_id = isset( $r['meta_query'][0]['value'] )
    494         ? $r['meta_query'][0]['value']
    495         : 0;
    496 
    497     // Filter & return
    498     return apply_filters( 'bbp_get_user_favorites', $query, $user_id, $r, $args );
     459    $r     = bbp_get_user_object_query( $args, 'favorites', '_bbp_favorite' );
     460    $query = bbp_has_topics( $r );
     461
     462    // Filter & return
     463    return apply_filters( 'bbp_get_user_favorites', $query, 0, $r, $args );
    499464}
    500465
     
    605570
    606571    // Bail if no topic ID is passed
    607     if ( empty( $_GET['topic_id'] ) ) {
     572    if ( empty( $_GET['object_id'] ) ) {
    608573        return $success;
    609574    }
     
    621586
    622587    // What action is taking place?
    623     $topic_id = bbp_get_topic_id( $_GET['topic_id'] );
     588    $topic_id = bbp_get_topic_id( $_GET['object_id'] );
    624589    $user_id  = bbp_get_user_id( 0, true, true );
    625590
     
    710675 */
    711676function bbp_get_user_topic_subscriptions( $args = array() ) {
    712 
    713     // Backwards compat for pre-2.6.0
    714     if ( is_numeric( $args ) ) {
    715         $args = array(
    716             'meta_query' => array( array(
    717                 'key'     => '_bbp_subscription',
    718                 'value'   => bbp_get_user_id( $args, false, false ),
    719                 'compare' => 'NUMERIC'
    720             ) )
    721         );
    722     }
    723 
    724     // Default arguments
    725     $defaults = array(
    726         'meta_query' => array( array(
    727             'key'     => '_bbp_subscription',
    728             'value'   => bbp_get_displayed_user_id(),
    729             'compare' => 'NUMERIC'
    730         ) )
    731     );
    732 
    733     // Parse arguments
    734     $r = bbp_parse_args( $args, $defaults, 'get_user_topic_subscriptions' );
    735 
    736     // Get the topics
    737     $query   = bbp_has_topics( $r );
    738     $user_id = isset( $r['meta_query'][0]['value'] )
    739         ? $r['meta_query'][0]['value']
    740         : 0;
    741 
    742     // Filter & return
    743     return apply_filters( 'bbp_get_user_topic_subscriptions', $query, $user_id, $r, $args );
     677    $r     = bbp_get_user_object_query( $args, 'topic_subscriptions', '_bbp_subscription' );
     678    $query = bbp_has_topics( $r );
     679
     680    // Filter & return
     681    return apply_filters( 'bbp_get_user_topic_subscriptions', $query, 0, $r, $args );
    744682}
    745683
     
    755693 */
    756694function bbp_get_user_forum_subscriptions( $args = array() ) {
    757 
    758     // Backwards compat for pre-2.6.0
    759     if ( is_numeric( $args ) ) {
    760         $args = array(
    761             'meta_query' => array( array(
    762                 'key'     => '_bbp_subscription',
    763                 'value'   => bbp_get_user_id( $args, false, false ),
    764                 'compare' => 'NUMERIC'
    765             ) )
    766         );
    767     }
    768 
    769     // Default arguments
    770     $defaults = array(
    771         'meta_query' => array( array(
    772             'key'     => '_bbp_subscription',
    773             'value'   => bbp_get_displayed_user_id(),
    774             'compare' => 'NUMERIC'
    775         ) )
    776     );
    777 
    778     // Parse arguments
    779     $r = bbp_parse_args( $args, $defaults, 'get_user_forum_subscriptions' );
    780 
    781     // Get the forums
    782     $query   = bbp_has_forums( $r );
    783     $user_id = isset( $r['meta_query'][0]['value'] )
    784         ? $r['meta_query'][0]['value']
    785         : 0;
    786 
    787     // Filter & return
    788     return apply_filters( 'bbp_get_user_forum_subscriptions', $query, $user_id, $r, $args );
     695    $r     = bbp_get_user_object_query( $args, 'forum_subscriptions', '_bbp_subscription' );
     696    $query = bbp_has_forums( $r );
     697
     698    // Filter & return
     699    return apply_filters( 'bbp_get_user_forum_subscriptions', $query, 0, $r, $args );
    789700}
    790701
Note: See TracChangeset for help on using the changeset viewer.