Skip to:
Content

BuddyPress.org

source: trunk/src/bp-groups/bp-groups-blocks.php

Last change on this file was 13296, checked in by imath, 3 months ago

Remove unnecessary 3rd argument when using has_action()

has_action() only accepts 2 arguments.

Props oztaser

Fixes #8635

  • Property svn:eol-style set to native
File size: 15.0 KB
Line 
1<?php
2/**
3 * BP Groups Blocks Functions.
4 *
5 * @package BuddyPress
6 * @subpackage GroupsBlocks
7 * @since 6.0.0
8 */
9
10// Exit if accessed directly.
11if ( ! defined( 'ABSPATH' ) ) {
12        exit;
13}
14
15/**
16 * Callback function to render the BP Group Block.
17 *
18 * @since 6.0.0
19 *
20 * @param array $attributes The block attributes.
21 * @return string           HTML output.
22 */
23function bp_groups_render_group_block( $attributes = array() ) {
24        $bp = buddypress();
25
26        $block_args = bp_parse_args(
27                $attributes,
28                array(
29                        'itemID'              => 0,
30                        'avatarSize'          => 'full',
31                        'displayDescription'  => true,
32                        'displayActionButton' => true,
33                        'displayCoverImage'   => true,
34                )
35        );
36
37        if ( ! $block_args['itemID'] ) {
38                return;
39        }
40
41        // Set the group ID and container classes.
42        $group_id          = (int) $block_args['itemID'];
43        $container_classes = array( 'bp-block-group' );
44
45        // Group object.
46        $group = groups_get_group( $group_id );
47
48        if ( ! $group->id ) {
49                return;
50        }
51
52        // Avatar variables.
53        $avatar           = '';
54        $avatar_container = '';
55
56        // Cover image variable.
57        $cover_image     = '';
58        $cover_style     = '';
59        $cover_container = '';
60
61        // Group name/link/description variables.
62        $group_name        = bp_get_group_name( $group );
63        $group_link        = bp_get_group_permalink( $group );
64        $group_description = '';
65        $group_content     = '';
66
67        // Group action button.
68        $action_button         = '';
69        $display_action_button = (bool) $block_args['displayActionButton'];
70
71        if ( $bp->avatar && $bp->avatar->show_avatars && ! bp_disable_group_avatar_uploads() && in_array( $block_args['avatarSize'], array( 'thumb', 'full' ), true ) ) {
72                $avatar = bp_core_fetch_avatar(
73                        array(
74                                'item_id' => $group->id,
75                                'object'  => 'group',
76                                'type'    => $block_args['avatarSize'],
77                                'html'    => false,
78                        )
79                );
80
81                $container_classes[] = 'avatar-' . $block_args['avatarSize'];
82        } else {
83                $container_classes[] = 'avatar-none';
84        }
85
86        if ( $avatar ) {
87                $avatar_container = sprintf(
88                        '<div class="item-header-avatar">
89                                <a href="%1$s">
90                                        <img loading="lazy" src="%2$s" alt="%3$s" class="avatar">
91                                </a>
92                        </div>',
93                        esc_url( $group_link ),
94                        esc_url( $avatar ),
95                        /* Translators: %s is the group's name. */
96                        sprintf( esc_attr__( 'Group Profile photo of %s', 'buddypress' ), esc_html( $group_name ) )
97                );
98        }
99
100        $display_cover_image = (bool) $block_args['displayCoverImage'];
101        if ( bp_is_active( 'groups', 'cover_image' ) && $display_cover_image ) {
102                $cover_image = bp_attachments_get_attachment(
103                        'url',
104                        array(
105                                'item_id'    => $group->id,
106                                'object_dir' => 'groups',
107                        )
108                );
109
110                if ( $cover_image ) {
111                        $cover_style = sprintf(
112                                ' style="background-image: url( %s );"',
113                                esc_url( $cover_image )
114                        );
115                }
116
117                $cover_container = sprintf(
118                        '<div class="bp-group-cover-image"%s></div>',
119                        $cover_style
120                );
121
122                $container_classes[] = 'has-cover';
123        }
124
125        $display_description = (bool) $block_args['displayDescription'];
126        if ( $display_description ) {
127                $group_description = bp_get_group_description( $group );
128                $group_content     = sprintf(
129                        '<div class="group-description-content">%s</div>',
130                        $group_description
131                );
132
133                $container_classes[] = 'has-description';
134        }
135
136        if ( $display_action_button ) {
137                $action_button = sprintf(
138                        '<div class="bp-profile-button">
139                                <a href="%1$s" class="button large primary button-primary" role="button">%2$s</a>
140                        </div>',
141                        esc_url( $group_link ),
142                        esc_html__( 'Visit Group', 'buddypress' )
143                );
144        }
145
146        $output = sprintf(
147                '<div class="%1$s">
148                        %2$s
149                        <div class="group-content">
150                                %3$s
151                                <div class="group-description">
152                                        <strong><a href="%4$s">%5$s</a></strong>
153                                        %6$s
154                                        %7$s
155                                </div>
156                        </div>
157                </div>',
158                implode( ' ', array_map( 'sanitize_html_class', $container_classes ) ),
159                $cover_container,
160                $avatar_container,
161                esc_url( $group_link ),
162                esc_html( $group_name ),
163                $group_content,
164                $action_button
165        );
166
167        // Compact all interesting parameters.
168        $params = array_merge( $block_args, compact( 'group_name', 'group_link', 'group_description', 'avatar', 'cover_image' ) );
169
170        /**
171         * Filter here to edit the output of the single group block.
172         *
173         * @since 6.0.0
174         *
175         * @param string          $output The HTML output of the block.
176         * @param BP_Groups_Group $group  The group object.
177         * @param array           $params The block extended parameters.
178         */
179        return apply_filters( 'bp_groups_render_group_block_output', $output, $group, $params );
180}
181
182/**
183 * Callback function to render the BP Groups Block.
184 *
185 * @since 7.0.0
186 *
187 * @param array $attributes The block attributes.
188 * @return string           HTML output.
189 */
190function bp_groups_render_groups_block( $attributes = array() ) {
191        $bp = buddypress();
192
193        $block_args = bp_parse_args(
194                $attributes,
195                array(
196                        'itemIDs'          => array(),
197                        'avatarSize'       => 'full',
198                        'displayGroupName' => true,
199                        'extraInfo'        => 'none',
200                        'layoutPreference' => 'list',
201                        'columns'          => '2',
202                )
203        );
204
205        $group_ids = wp_parse_id_list( $block_args['itemIDs'] );
206        if ( ! array_filter( $group_ids ) ) {
207                return '';
208        }
209
210        $container_classes = sprintf( 'bp-block-groups avatar-%s', $block_args['avatarSize'] );
211        if ( 'grid' === $block_args['layoutPreference'] ) {
212                $container_classes .= sprintf( ' is-grid columns-%d', (int) $block_args['columns'] );
213        }
214
215        $query = groups_get_groups(
216                array(
217                        'include' => $group_ids,
218                )
219        );
220
221        // Initialize the output and the groups.
222        $output = '';
223        $groups = $query['groups'];
224
225        foreach ( $groups as $group ) {
226                $has_description    = false;
227                $group_item_classes = 'group-content';
228
229                if ( 'list' === $block_args['layoutPreference'] && 'description' === $block_args['extraInfo'] && isset( $group->description ) && $group->description ) {
230                        $has_description    = true;
231                        $group_item_classes = 'group-content has-description';
232                }
233
234                $output .= sprintf( '<div class="%s">', $group_item_classes );
235
236                // Get Member link.
237                $group_link = bp_get_group_permalink( $group );
238
239                // Set the Avatar output.
240                if ( $bp->avatar && $bp->avatar->show_avatars && ! bp_disable_group_avatar_uploads() && 'none' !== $block_args['avatarSize'] ) {
241                        $output .= sprintf(
242                                '<div class="item-header-avatar">
243                                        <a href="%1$s">
244                                                <img loading="lazy" src="%2$s" alt="%3$s" class="avatar">
245                                        </a>
246                                </div>',
247                                esc_url( $group_link ),
248                                esc_url(
249                                        bp_core_fetch_avatar(
250                                                array(
251                                                        'item_id' => $group->id,
252                                                        'object'  => 'group',
253                                                        'type'    => $block_args['avatarSize'],
254                                                        'html'    => false,
255                                                )
256                                        )
257                                ),
258                                /* Translators: %s is the group's name. */
259                                sprintf( esc_attr__( 'Group Profile photo of %s', 'buddypress' ), esc_html( $group->name ) )
260                        );
261                }
262
263                $output .= '<div class="group-description">';
264
265                if ( $block_args['displayGroupName'] ) {
266                        $output .= sprintf(
267                                '<strong><a href="%1$s">%2$s</a></strong>',
268                                esc_url( $group_link ),
269                                esc_html( $group->name )
270                        );
271                }
272
273                // Add the latest activity the group posted.
274                if ( $has_description && $group->description ) {
275                        $output .= sprintf(
276                                '<div class="group-description-content">%s</div>',
277                                bp_get_group_description( $group )
278                        );
279                } elseif ( 'active' === $block_args['extraInfo'] ) {
280                        $output .= sprintf(
281                                '<time datetime="%1$s">%2$s</time>',
282                                esc_attr( bp_core_get_iso8601_date( $group->last_activity ) ),
283                                /* translators: %s: last activity timestamp (e.g. "Active 1 hour ago") */
284                                sprintf( esc_html__( 'Active %s', 'buddypress' ), bp_get_group_last_active( $group ) )
285                        );
286                } elseif ( 'popular' === $block_args['extraInfo'] ) {
287                        $total_member_count = $group->total_member_count;
288
289                        $output .= sprintf(
290                                '<div class="group-meta">%s</div>',
291                                /* translators: %d: the number of group members. */
292                                esc_html( sprintf( _n( '%d member', '%d members', $total_member_count, 'buddypress' ), $total_member_count ) )
293                        );
294                }
295
296                $output .= '</div></div>';
297        }
298
299        // Set the final output.
300        $output = sprintf( '<div class="%1$s">%2$s</div>', $container_classes, $output );
301
302        /**
303         * Filter here to edit the output of the groups block.
304         *
305         * @since 7.0.0
306         *
307         * @param string $output     The HTML output of the block.
308         * @param array  $block_args The block arguments.
309         * @param array  $groups     The list of BP_Groups_Group objects.
310         */
311        return apply_filters( 'bp_groups_render_groups_block_output', $output, $block_args, $groups );
312}
313
314/**
315 * Adds specific script data for the BP Groups blocks.
316 *
317 * Only used for the BP Dynamic Groups block.
318 *
319 * @since 9.0.0
320 */
321function bp_groups_blocks_add_script_data() {
322        $dynamic_groups_blocks = array_filter( buddypress()->groups->block_globals['bp/dynamic-groups']->items );
323
324        if ( ! $dynamic_groups_blocks ) {
325                return;
326        }
327
328        $path = sprintf(
329                '/%1$s/%2$s/%3$s',
330                bp_rest_namespace(),
331                bp_rest_version(),
332                buddypress()->groups->id
333        );
334
335        wp_localize_script(
336                'bp-dynamic-groups-script',
337                'bpDynamicGroupsSettings',
338                array(
339                        'path'  => ltrim( $path, '/' ),
340                        'root'  => esc_url_raw( get_rest_url() ),
341                        'nonce' => wp_create_nonce( 'wp_rest' ),
342                )
343        );
344
345        // Include the common JS template.
346        echo bp_get_dynamic_template_part( 'assets/widgets/dynamic-groups.php' );
347
348        // List the block specific props.
349        wp_add_inline_script(
350                'bp-dynamic-groups-script',
351                sprintf( 'var bpDynamicGroupsBlocks = %s;', wp_json_encode( array_values( $dynamic_groups_blocks ) ) ),
352                'before'
353        );
354}
355
356/**
357 * Callback function to render the Dynamic Groups Block.
358 *
359 * @since 9.0.0
360 *
361 * @param array $attributes The block attributes.
362 * @return string           HTML output.
363 */
364function bp_groups_render_dynamic_groups_block( $attributes = array() ) {
365        $block_args = bp_parse_args(
366                $attributes,
367                array(
368                        'title'        => __( 'Groups', 'buddypress' ),
369                        'maxGroups'    => 5,
370                        'groupDefault' => 'active',
371                        'linkTitle'    => false,
372                )
373        );
374
375        $classnames         = 'widget_bp_groups_widget buddypress widget';
376        $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) );
377
378        $max_groups = (int) $block_args['maxGroups'];
379        $no_groups  = __( 'There are no groups to display.', 'buddypress' );
380
381        /** This filter is documented in buddypress/src/bp-groups/classes/class-bp-groups-widget.php */
382        $separator = apply_filters( 'bp_groups_widget_separator', '|' );
383
384        // Make sure the widget ID is unique.
385        $widget_id             = uniqid( 'groups-list-' );
386        $groups_directory_link = bp_get_groups_directory_permalink();
387
388        // Set the Block's title.
389        if ( true === $block_args['linkTitle'] ) {
390                $widget_content = sprintf(
391                        '<h2 class="widget-title"><a href="%1$s">%2$s</a></h2>',
392                        esc_url( $groups_directory_link ),
393                        esc_html( $block_args['title'] )
394                );
395        } else {
396                $widget_content = sprintf( '<h2 class="widget-title">%s</h2>', esc_html( $block_args['title'] ) );
397        }
398
399        $item_options = array(
400                'newest'       => array(
401                        'class' => '',
402                        'label' => __( 'Newest', 'buddypress' ),
403                ),
404                'active'       => array(
405                        'class' => '',
406                        'label' => __( 'Active', 'buddypress' ),
407                ),
408                'popular'      => array(
409                        'class' => '',
410                        'label' => __( 'Popular', 'buddypress' ),
411                ),
412                'alphabetical' => array(
413                        'class' => '',
414                        'label' => __( 'Alphabetical', 'buddypress' ),
415                ),
416        );
417
418        $item_options_output = array();
419        $separator_output    = sprintf( ' <span class="bp-separator" role="separator">%s</span> ', esc_html( $separator ) );
420
421        foreach ( $item_options as $item_type => $item_attr ) {
422                if ( $block_args['groupDefault'] === $item_type ) {
423                        $item_attr['class'] = ' class="selected"';
424                }
425
426                $item_options_output[] = sprintf(
427                        '<a href="%1$s" data-bp-sort="%2$s"%3$s>%4$s</a>',
428                        esc_url( $groups_directory_link ),
429                        esc_attr( $item_type ),
430                        $item_attr['class'],
431                        esc_html( $item_attr['label'] )
432                );
433        }
434
435        $preview      = '';
436        $default_args = array(
437                'type'            => $block_args['groupDefault'],
438                'per_page'        => $max_groups,
439                'populate_extras' => true,
440        );
441
442        // Previewing the Block inside the editor.
443        if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
444                $bp_query = groups_get_groups( $default_args );
445                $preview  = sprintf( '<div class="widget-error">%s</div>', $no_groups );
446
447                if ( is_array( $bp_query['groups'] ) && 0 < count( $bp_query['groups'] ) ) {
448                        $preview = '';
449                        foreach ( $bp_query['groups'] as $group ) {
450                                if ( 'newest' === $block_args['groupDefault'] ) {
451                                        /* translators: %s is time elapsed since the group was created */
452                                        $extra = sprintf( __( 'Created %s', 'buddypress' ), bp_get_group_date_created( $group ) );
453                                } elseif ( 'popular' === $block_args['groupDefault'] ) {
454                                        $count = (int) $group->total_member_count;
455
456                                        /* translators: %s is the number of Group members */
457                                        $extra = sprintf( _n( '%s member', '%s members', $count, 'buddypress' ), bp_core_number_format( $count ) );
458                                } else {
459                                        /* translators: %s: last activity timestamp (e.g. "Active 1 hour ago") */
460                                        $extra = sprintf( __( 'Active %s', 'buddypress' ), bp_get_group_last_active( $group ) );
461                                }
462
463                                $preview .= bp_get_dynamic_template_part(
464                                        'assets/widgets/dynamic-groups.php',
465                                        'php',
466                                        array(
467                                                'data.link'              => bp_get_group_permalink( $group ),
468                                                'data.name'              => bp_get_group_name( $group ),
469                                                'data.avatar_urls.thumb' => bp_core_fetch_avatar(
470                                                        array(
471                                                                'item_id' => $group->id,
472                                                                'html'    => false,
473                                                                'object'  => 'group',
474                                                        )
475                                                ),
476                                                'data.avatar_alt'        => esc_attr(
477                                                        sprintf(
478                                                                /* Translators: %s is the group's name. */
479                                                                __( 'Group Profile photo of %s', 'buddypress' ),
480                                                                $group->name
481                                                        )
482                                                ),
483                                                'data.id'                => $group->id,
484                                                'data.extra'             => $extra,
485                                        )
486                                );
487                        }
488                }
489        } elseif ( defined( 'WP_USE_THEMES' ) ) {
490                // Get corresponding members.
491                $path = sprintf(
492                        '/%1$s/%2$s/%3$s',
493                        bp_rest_namespace(),
494                        bp_rest_version(),
495                        buddypress()->groups->id
496                );
497
498                $default_path = add_query_arg(
499                        $default_args,
500                        $path
501                );
502
503                $preloaded_groups = rest_preload_api_request( '', $default_path );
504
505                buddypress()->groups->block_globals['bp/dynamic-groups']->items[ $widget_id ] = (object) array(
506                        'selector'   => $widget_id,
507                        'query_args' => $default_args,
508                        'preloaded'  => reset( $preloaded_groups ),
509                );
510
511                // Only enqueue common/specific scripts and data once per page load.
512                if ( ! has_action( 'wp_footer', 'bp_groups_blocks_add_script_data' ) ) {
513                        wp_set_script_translations( 'bp-dynamic-groups-script', 'buddypress' );
514                        wp_enqueue_script( 'bp-dynamic-groups-script' );
515
516                        add_action( 'wp_footer', 'bp_groups_blocks_add_script_data', 1 );
517                }
518        }
519
520        $widget_content .= sprintf(
521                '<div class="item-options">
522                        %1$s
523                </div>
524                <ul id="%2$s" class="item-list" aria-live="polite" aria-relevant="all" aria-atomic="true">
525                        %3$s
526                </ul>',
527                implode( $separator_output, $item_options_output ),
528                esc_attr( $widget_id ),
529                $preview
530        );
531
532        // Adds a container to make sure the block is styled even when used into the Columns parent block.
533        $widget_content = sprintf( '<div class="bp-dynamic-block-container">%s</div>', "\n" . $widget_content . "\n" );
534
535        // Only add a block wrapper if not loaded into a Widgets sidebar.
536        if ( ! did_action( 'dynamic_sidebar_before' ) ) {
537                return sprintf(
538                        '<div %1$s>%2$s</div>',
539                        $wrapper_attributes,
540                        $widget_content
541                );
542        }
543
544        return $widget_content;
545}
Note: See TracBrowser for help on using the repository browser.