Skip to:
Content

BuddyPress.org

Ticket #6772: 6772.01.patch

File 6772.01.patch, 14.5 KB (added by r-a-y, 9 years ago)
  • new file src/bp-activity/bp-activity-embeds.php

    new file mode 100644
    - +  
     1<?php
     2/**
     3 * Functions related to embedding single activity items externally.
     4 *
     5 * Relies on WordPress 4.4.
     6 *
     7 * @since 2.5.0
     8 *
     9 * @package BuddyPress
     10 * @subpackage ActivityEmbeds
     11 */
     12
     13// Exit if accessed directly.
     14defined( 'ABSPATH' ) || exit;
     15
     16/**
     17 * Register oEmbed provider on BuddyPress pages.
     18 *
     19 * This allows single activity items to be embedded.  WP's TinyMCE doesn't
     20 * require this somehow, which is why we only do this on BuddyPress pages.
     21 *
     22 * @since 2.5.0
     23 *
     24 * @todo Fix up issues with javascript not firing to hide the fallback <blockquote>
     25 */
     26function bp_activity_embed_add_oembed_provider() {
     27        // Only register our provider on BuddyPress pages.
     28        if ( false === is_buddypress() ) {
     29                return;
     30        }
     31
     32        if ( bp_core_enable_root_profiles() ) {
     33                $domain = bp_get_root_domain();
     34        } else {
     35                $domain = bp_get_members_directory_permalink();
     36        }
     37
     38        wp_oembed_add_provider( $domain . '*/activity/*', get_oembed_endpoint_url() );
     39}
     40add_action( 'bp_init', 'bp_activity_embed_add_oembed_provider' );
     41
     42/**
     43 * Use our custom embed template for activity items.
     44 *
     45 * @since 2.5.0
     46 *
     47 * @param  string $retval Current embed template
     48 * @return string
     49 */
     50function bp_activity_embed_filter_template( $retval ) {
     51        if ( ! bp_is_single_activity() ) {
     52                return $retval;
     53        }
     54
     55        // Embed template hierarchy!
     56        return bp_locate_template( array(
     57                'embeds/template-single-activity.php',
     58                'embeds/template.php'
     59        ) );
     60}
     61add_filter( 'embed_template', 'bp_activity_embed_filter_template' );
     62
     63/**
     64 * Inject activity content into the embed template.
     65 *
     66 * @since 2.5.0
     67 */
     68function bp_activity_embed_inject_content() {
     69        if ( ! bp_is_single_activity() ) {
     70                return;
     71        }
     72
     73        bp_get_template_part( 'embeds/activity' );
     74}
     75add_action( 'embed_content', 'bp_activity_embed_inject_content' );
     76
     77/**
     78 * Adds oEmbed discovery links on single activity pages.
     79 *
     80 * @since 2.5.0
     81 *
     82 * @param  string $retval Current discovery links.
     83 * @return string
     84 */
     85function bp_activity_embed_oembed_discovery_links( $retval ) {
     86        if ( ! bp_is_single_activity() ) {
     87                return $retval;
     88        }
     89
     90        $permalink = bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_current_action() . '/';
     91
     92        $retval = '<link rel="alternate" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( $permalink ) ) . '" />' . "\n";
     93
     94        if ( class_exists( 'SimpleXMLElement' ) ) {
     95                $retval .= '<link rel="alternate" type="text/xml+oembed" href="' . esc_url( get_oembed_endpoint_url( $permalink, 'xml' ) ) . '" />' . "\n";
     96        }
     97
     98        return $retval;
     99}
     100add_filter( 'oembed_discovery_links', 'bp_activity_embed_oembed_discovery_links' );
     101
     102/**
     103 * Filter the oEmbed post ID.
     104 *
     105 * WP needs a real WordPress post otherwise oEmbed will fail.  So here, we
     106 * pass the Members Directory page ID as a dummy, while adding some markers
     107 * that we will use to filter other parts of oEmbed so activity embedding will
     108 * work.
     109 *
     110 * @since 2.5.0
     111 *
     112 * @param  int    $retval Current post ID
     113 * @param  string $url Current embed URL
     114 * @return int
     115 */
     116function bp_activity_embed_filter_oembed_request_post_id( $retval, $url ) {
     117        // Check the URL to see if this is a single activity URL.
     118        // @todo Do checks for BP root domain
     119        if ( 0 !== strpos( $url, bp_get_members_directory_permalink() ) ) {
     120                return $retval;
     121        }
     122
     123        // Check for activity slug
     124        if ( false === strpos( $url, '/' . bp_get_activity_slug() . '/' ) ) {
     125                return $retval;
     126        }
     127
     128        $url = trim( untrailingslashit( $url ) );
     129
     130        // Grab the activity ID
     131        $activity_id = (int) substr(
     132                $url,
     133                strrpos( $url, '/' ) + 1
     134        );
     135        if ( empty( $activity_id ) ) {
     136                return $retval;
     137        }
     138
     139        // Check if activity item still exists.
     140        $activity = new BP_Activity_Activity( $activity_id );
     141        if ( empty( $activity->component ) ) {
     142                return $retval;
     143        }
     144
     145        // Add markers to tell that we're embedding a single activity
     146        buddypress()->activity->embedurl_in_progress = $url;
     147        buddypress()->activity->embedid_in_progress  = $activity_id;
     148
     149        // Bypass explicit post check by passing members directory page ID
     150        $page_ids = bp_core_get_directory_page_ids();
     151        return $page_ids['members'];
     152}
     153add_filter( 'oembed_request_post_id', 'bp_activity_embed_filter_oembed_request_post_id', 10, 2 );
     154
     155/**
     156 * Pass our BuddyPress activity permalink for embedding.
     157 *
     158 * @since 2.5.0
     159 *
     160 * @see bp_activity_oembed_request_post_id()
     161 *
     162 * @param  string $retval Current embed URL
     163 * @return string
     164 */
     165function bp_activity_embed_filter_post_embed_url( $retval ) {
     166        if ( false === isset( buddypress()->activity->embedurl_in_progress ) && ! bp_is_single_activity() ) {
     167                return $retval;
     168        }
     169
     170        $url = bp_is_single_activity() ? bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_current_action() . '/' : buddypress()->activity->embedurl_in_progress;
     171        $url = trailingslashit( $url );
     172
     173        // This is for the 'WordPress Embed' block
     174        // @see bp_activity_embed_comments_button()
     175        if ( 'the_permalink' !== current_filter() ) {
     176                $url = add_query_arg( 'embed', 'true', trailingslashit( $url ) );
     177        }
     178
     179        return $url;
     180}
     181add_filter( 'post_embed_url', 'bp_activity_embed_filter_post_embed_url' );
     182
     183/**
     184 * Filter the oEmbed response data to reference our activity content.
     185 *
     186 * @since 2.5.0
     187 *
     188 * @param  array $retval Current response data
     189 * @return array
     190 */
     191function bp_activity_embed_filter_oembed_response_data( $retval ) {
     192        if ( false === isset( buddypress()->activity->embedurl_in_progress ) ) {
     193                return $retval;
     194        }
     195
     196        $activity = new BP_Activity_Activity( buddypress()->activity->embedid_in_progress );
     197
     198        $retval['title'] = __( 'Activity', 'buddypress' );
     199        $retval['author_url'] = bp_core_get_user_domain( $activity->user_id );
     200
     201        return $retval;
     202}
     203add_filter( 'oembed_response_data', 'bp_activity_embed_filter_oembed_response_data', 20 );
     204
     205/**
     206 * Filter the embed HTML for default oEmbed fallback HTML.
     207 *
     208 * @param  string $retval Current embed HTML
     209 * @return string
     210 */
     211function bp_activity_embed_filter_html( $retval ) {
     212        if ( false === isset( buddypress()->activity->embedurl_in_progress ) && ! bp_is_single_activity() ) {
     213                return $retval;
     214        }
     215
     216        // Change 'Embedded WordPress Post' to 'Embedded Activity Item'
     217        $retval = str_replace( __( 'Embedded WordPress Post' ), __( 'Embedded Activity Item', 'buddypress' ), $retval );
     218
     219        // Remove default <blockquote>
     220        $retval = substr( $retval, strpos( $retval, '</blockquote>' ) + 13 );
     221
     222        // Set up new <blockquote>
     223        $activity_id = bp_is_single_activity() ? bp_current_action() : buddypress()->activity->embedid_in_progress;
     224        $activity    = new BP_Activity_Activity( $activity_id );
     225        $mentionname = bp_activity_do_mentions() ? ' (@' . bp_activity_get_user_mentionname( $activity->user_id ) . ')' : '';
     226        $date        = date_i18n( get_option( 'date_format' ), strtotime( $activity->date_recorded ) );
     227
     228        // 'wp-embedded-content' CSS class is necessary due to how the embed JS works.
     229        $blockquote = sprintf( '<blockquote class="wp-embedded-content bp-activity-item">%1$s%2$s %3$s</blockquote>',
     230                apply_filters( 'bp_get_activity_content_body', $activity->content ),
     231                '- ' . bp_core_get_user_displayname( $activity->user_id ) . $mentionname,
     232                '<a href="' . esc_url( bp_activity_get_permalink( $activity_id ) ) . '">' . $date . '</a>'
     233        );
     234
     235        /**
     236         * Filters the fallback HTML used when embedding a BP activity item.
     237         *
     238         * @since 2.5.0
     239         *
     240         * @param string               $blockquote Current fallback HTML
     241         * @param BP_Activity_Activity $activity   Activity object
     242         */
     243        $blockquote = apply_filters( 'bp_activity_embed_fallback_html', $blockquote, $activity );
     244
     245        // Add our custom <blockquote>
     246        return $blockquote . $retval;
     247}
     248add_filter( 'embed_html', 'bp_activity_embed_filter_html' );
     249
     250/**
     251 * Prints the markup for the activity embed comments button.
     252 *
     253 * @since 2.5.0
     254 */
     255function bp_activity_embed_comments_button() {
     256        if ( ! bp_is_single_activity() ) {
     257                return;
     258        }
     259
     260        // Make sure our custom permalink shows up in the 'WordPress Embed' block.
     261        add_filter( 'the_permalink', 'bp_activity_embed_filter_post_embed_url' );
     262
     263        // Only show comment bubble if we have some activity comments.
     264        $count = bp_activity_get_comment_count();
     265        if ( empty( $count ) ) {
     266                return;
     267        }
     268?>
     269
     270        <div class="wp-embed-comments">
     271                <a href="<?php bp_activity_thread_permalink(); ?>">
     272                        <span class="dashicons dashicons-admin-comments"></span>
     273                        <?php
     274                        printf(
     275                                _n(
     276                                        '%s <span class="screen-reader-text">Comment</span>',
     277                                        '%s <span class="screen-reader-text">Comments</span>',
     278                                        $count
     279                                ),
     280                                number_format_i18n( $count )
     281                        );
     282                        ?>
     283                </a>
     284        </div>
     285
     286<?php
     287}
     288add_action( 'embed_content_meta', 'bp_activity_embed_comments_button', 5 );
     289 No newline at end of file
  • src/bp-activity/bp-activity-loader.php

     
    3131                        array(
    3232                                'adminbar_myaccount_order' => 10,
    3333                                'search_query_arg' => 'activity_search',
     34                                'features' => array( 'embeds' )
    3435                        )
    3536                );
    3637        }
     
    6768                        $includes[] = 'akismet';
    6869                }
    6970
     71                // Embeds - only applicable for WP 4.4+
     72                if ( bp_get_major_wp_version() >= 4.4 && bp_is_active( $this->id, 'embeds' ) ) {
     73                        $includes[] = 'embeds';
     74                }
     75
     76                // Admin-specific
    7077                if ( is_admin() ) {
    7178                        $includes[] = 'admin';
    7279                }
  • new file src/bp-templates/bp-legacy/buddypress/embeds/activity.php

    new file mode 100644
    - +  
     1
     2                <?php if ( bp_has_activities( 'display_comments=threaded&show_hidden=true&include=' . bp_current_action() ) ) : ?>
     3
     4                        <?php while ( bp_activities() ) : bp_the_activity(); ?>
     5                                <div class="wp-embed-excerpt"><?php bp_activity_content_body(); ?></div>
     6
     7                                <p><a href="<?php bp_activity_thread_permalink(); ?>"><?php echo date_i18n( get_option( 'time_format' ) . ' - ' . get_option( 'date_format' ), strtotime( bp_get_activity_date_recorded() ) ); ?></a></p>
     8                        <?php endwhile; ?>
     9
     10                <?php else : ?>
     11
     12                        <?php bp_get_template_part( 'embeds/not-found' ); ?>
     13
     14                <?php endif; ?>
     15
  • new file src/bp-templates/bp-legacy/buddypress/embeds/css.php

    new file mode 100644
    - +  
     1<style type="text/css">
     2#wp-embed-header:after {
     3        clear: both;
     4        content: "";
     5        display: table;
     6        margin-bottom: 1em;
     7}
     8
     9.wp-embed-avatar {
     10        float: left;
     11        margin: 0 .75em 0 0;
     12}
     13
     14p.wp-embed-heading {
     15        font-size: 16px;
     16        margin-bottom: 0;
     17}
     18
     19.wp-embed-excerpt {
     20        margin-bottom: .5em;
     21}
     22
     23.wp-embed-footer {
     24        margin-top: 20px;
     25}
     26</style>
     27 No newline at end of file
  • new file src/bp-templates/bp-legacy/buddypress/embeds/footer.php

    new file mode 100644
    - +  
     1                        <div class="wp-embed-footer">
     2                                <div class="wp-embed-site-title">
     3                                        <?php
     4                                        $site_title = sprintf(
     5                                                '<a href="%s"><img src="%s" srcset="%s 2x" width="32" height="32" alt="" class="wp-embed-site-icon"/><span>%s</span></a>',
     6                                                esc_url( home_url() ),
     7                                                esc_url( get_site_icon_url( 32, admin_url( 'images/w-logo-blue.png' ) ) ),
     8                                                esc_url( get_site_icon_url( 64, admin_url( 'images/w-logo-blue.png' ) ) ),
     9                                                esc_html( get_bloginfo( 'name' ) )
     10                                        );
     11
     12                                        /**
     13                                         * Filter the site title HTML in the embed footer.
     14                                         *
     15                                         * @since 4.4.0
     16                                         *
     17                                         * @param string $site_title The site title HTML.
     18                                         */
     19                                        echo apply_filters( 'embed_site_title_html', $site_title );
     20                                        ?>
     21                                </div>
     22
     23                                <div class="wp-embed-meta">
     24                                        <?php
     25                                        /**
     26                                         * Print additional meta content in the embed template.
     27                                         *
     28                                         * @since 4.4.0
     29                                         */
     30                                        do_action( 'embed_content_meta');
     31                                        ?>
     32                                </div>
     33                        </div>
     34 No newline at end of file
  • new file src/bp-templates/bp-legacy/buddypress/embeds/header.php

    new file mode 100644
    - +  
     1
     2                <div id="wp-embed-header">
     3                        <div class="wp-embed-avatar">
     4                                <a href="<?php bp_displayed_user_link(); ?>">
     5                                        <?php bp_displayed_user_avatar( 'type=thumb&width=36&height=36' ); ?>
     6                                </a>
     7                        </div>
     8
     9                        <p class="wp-embed-heading">
     10                                <a href="<?php bp_displayed_user_link(); ?>">
     11                                        <?php bp_displayed_user_fullname(); ?>
     12                                </a>
     13                        </p>
     14
     15                        <?php if ( bp_is_active( 'activity' ) && bp_activity_do_mentions() ) : ?>
     16                                <p class="wp-embed-mentionname">@<?php bp_displayed_user_mentionname(); ?></p>
     17                        <?php endif; ?>
     18                </div>
  • new file src/bp-templates/bp-legacy/buddypress/embeds/template.php

    new file mode 100644
    - +  
     1<?php
     2/**
     3 * Generic embed template used by BuddyPress.
     4 *
     5 * When a BuddyPress item is embedded in an iframe, this file is used to
     6 * create the output.
     7 *
     8 * This is a modified version of the bundled WordPress embed template
     9 * included in WordPress 4.4+.
     10 *
     11 * @since 2.5.0
     12 *
     13 * @package BuddyPress
     14 * @subpackage Embeds
     15 */
     16
     17if ( ! headers_sent() ) {
     18        header( 'X-WP-embed: true' );
     19}
     20
     21?>
     22<!DOCTYPE html>
     23<html <?php language_attributes(); ?> class="no-js">
     24<head>
     25        <title><?php echo wp_get_document_title(); ?></title>
     26        <meta http-equiv="X-UA-Compatible" content="IE=edge">
     27        <base target="_top" />
     28        <?php
     29        /** This action is documented in wp-includes/embed-template.php */
     30        do_action( 'embed_head' );
     31
     32        // This is used by r-a-y for testing purposes at the moment.
     33        bp_get_template_part( 'embeds/css' );
     34        ?>
     35</head>
     36<body <?php body_class(); ?>>
     37<div <?php post_class( 'wp-embed' ); ?>>
     38<?php
     39bp_get_template_part( 'embeds/header', bp_current_component() );
     40
     41/** This action is documented in wp-includes/embed-template.php */
     42do_action( 'embed_content' );
     43
     44bp_get_template_part( 'embeds/footer', bp_current_component() );
     45?>
     46
     47</div>
     48
     49<?php
     50/** This action is documented in wp-includes/embed-template.php */
     51do_action( 'embed_footer' );
     52?>
     53</body>
     54</html>
     55 No newline at end of file