[buddypress-trac] [BuddyPress Trac] #8378: Calls to `xprofile_get_field()` can result in unnecessary database queries

buddypress-trac noreply at wordpress.org
Wed Oct 21 21:38:44 UTC 2020


#8378: Calls to `xprofile_get_field()` can result in unnecessary database queries
------------------------------+-----------------------------
 Reporter:  boonebgorges      |      Owner:  (none)
     Type:  defect (bug)      |     Status:  new
 Priority:  normal            |  Milestone:  Awaiting Review
Component:  Extended Profile  |    Version:
 Severity:  normal            |   Keywords:
------------------------------+-----------------------------
 When calling `xprofile_get_field()`, the `$get_data` parameter defaults to
 `true`. When users are logged out, this doesn't have an effect. But when
 users are logged in, this means that calls to `xprofile_get_field()` will
 pull up the data for that field for the logged-in user. See
 https://buddypress.trac.wordpress.org/browser/tags/6.3.0/src/bp-
 xprofile/classes/class-bp-xprofile-field.php?marks=202-204#L189.

 In the vast majority of cases, this feels inappropriate. A function named
 `xprofile_get_field()` should pull up the *field*. It should not load
 other data unless specifically asked to do so.

 This happens in at least one place in BP itself. When you fetch user data
 for a specific field using `xprofile_get_field_data()`, the value is
 passed through the `xprofile_filter_format_field_value_by_field_id()`
 filter. This function needs to fetch the field's `type`, so it pulls up
 the field using `xprofile_get_field()`. See
 https://buddypress.trac.wordpress.org/browser/tags/6.3.0/src/bp-xprofile
 /bp-xprofile-filters.php?marks=313#L302.

 This can result in large numbers of unnecessary database hits. Even in
 cases where persistent caching is present, the idiosyncratic cache
 behavior of `BP_XProfile_ProfileData` means that users who don't have a
 value set for the field in question will always result in a cache miss.
 See https://buddypress.trac.wordpress.org/browser/tags/6.3.0/src/bp-
 xprofile/classes/class-bp-xprofile-profiledata.php?marks=94-96#L82.

 There are a few things worth discussing:

 1. The `$userdata` fallback in `BP_XProfile_Field::populate()` goes back
 to the very origins of BuddyPress. See
 https://buddypress.trac.wordpress.org/browser/trunk/bp-xprofile/bp-
 xprofile-classes.php?annotate=blame&rev=2786&marks=240-242#L231 - I didn't
 trace it back any further. As noted above, I think it's an error to have
 this behavior here. But it might be too hard to change at this point. But
 we could probably make it somewhat easier to override, for example by
 checking `null === $user_id`; this would allow you to pass `0` to
 explicitly override the behavior.

 2. We should audit use of `xprofile_get_field()` in BP to ensure that
 we're explicitly calling `$get_data = false` when appropriate. The
 `xprofile_filter_format_field_value_by_field_id()` is one example.

 3. When querying for a user's field data, null query results should be
 cached.

 Some of these changes are harder than others and may warrant separate
 tickets. I'll start with a patch for item 2 and see what others think.

-- 
Ticket URL: <https://buddypress.trac.wordpress.org/ticket/8378>
BuddyPress Trac <http://buddypress.org/>
BuddyPress Trac


More information about the buddypress-trac mailing list