Skip to:
Content

BuddyPress.org

Changeset 9621


Ignore:
Timestamp:
03/16/2015 06:59:09 PM (4 years ago)
Author:
djpaul
Message:

Activity: improve blog post excerpts by showing rich media from the post.

Prior to this change, when we created excerpts for new/updated blog post activity items, we'd try to use any single image referenced in that blog post, and use it to decorate and bring interactivity to the activity stream item. This was inconsistently applied -- it was dependant on the length of the original post -- and ignored other possible media sources, such as oEmbeds and video/audio shortcodes.

Now, we use the media extractor (r9619) to extract comprehensive media information from a new/updated blog post, and use the information to build a much richer excerpt for blogs posts for activity items.

See #6177

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-activity/bp-activity-filters.php

    r9475 r9621  
    387387 * Truncate long activity entries when viewed in activity streams.
    388388 *
     389 * This method can only be used inside the Activity loop.
     390 *
    389391 * @since BuddyPress (1.5.0)
    390392 *
     
    403405    global $activities_template;
    404406
     407    /**
     408     * Provides a filter that lets you choose whether to skip this filter on a per-activity basis.
     409     *
     410     * @param bool $maybe_truncate_text If true, text should be checked to see if it needs truncating.
     411     * @since BuddyPress (2.3.0)
     412     */
     413    $maybe_truncate_text = apply_filters( 'bp_activity_maybe_truncate_entry',
     414        ! in_array( $activities_template->activity->type, array( 'new_blog_post', ), true )
     415    );
     416
    405417    // The full text of the activity update should always show on the single activity screen
    406     if ( bp_is_single_activity() )
     418    if ( ! $maybe_truncate_text || bp_is_single_activity() ) {
    407419        return $text;
     420    }
    408421
    409422    /**
  • trunk/src/bp-activity/bp-activity-functions.php

    r9471 r9621  
    18701870    );
    18711871
    1872     // Remove large images and replace them with just one image thumbnail.
    1873     if ( ! empty( $activity_args['content'] ) ) {
    1874         $activity_args['content'] = bp_activity_thumbnail_content_images( $activity_args['content'], $activity_args['primary_link'], $activity_args );
    1875     }
    1876 
    18771872    if ( ! empty( $activity_args['content'] ) ) {
    18781873        // Create the excerpt.
    1879         $activity_excerpt = bp_create_excerpt( $activity_args['content'] );
     1874        $activity_summary = bp_activity_create_summary( $activity_args['content'], $activity_args );
    18801875
    18811876        // Backward compatibility filter for blog posts.
    18821877        if ( 'blogs' == $activity_post_object->component_id )  {
    1883             $activity_args['content'] = apply_filters( 'bp_blogs_record_activity_content', $activity_excerpt, $activity_args['content'], $activity_args, $post->post_type );
     1878            $activity_args['content'] = apply_filters( 'bp_blogs_record_activity_content', $activity_summary, $activity_args['content'], $activity_args, $post->post_type );
    18841879        } else {
    1885             $activity_args['content'] = $activity_excerpt;
     1880            $activity_args['content'] = $activity_summary;
    18861881        }
    18871882    }
     
    19641959
    19651960    if ( ! empty( $post->post_content ) ) {
    1966         // Make sure to update the thumbnail image.
    1967         $post_content = bp_activity_thumbnail_content_images( $post->post_content, $activity->primary_link, (array) $activity );
    1968 
    1969         // Generate an excerpt.
    1970         $activity_excerpt = bp_create_excerpt( $post_content );
     1961        $activity_summary = bp_activity_create_summary( $post->post_content, (array) $activity );
    19711962
    19721963        // Backward compatibility filter for the blogs component.
    19731964        if ( 'blogs' == $activity_post_object->component_id ) {
    1974             $activity->content = apply_filters( 'bp_blogs_record_activity_content', $activity_excerpt, $post_content, (array) $activity, $post->post_type );
     1965            $activity->content = apply_filters( 'bp_blogs_record_activity_content', $activity_summary, $post->post_content, (array) $activity, $post->post_type );
    19751966        } else {
    1976             $activity->content = $activity_excerpt;
     1967            $activity->content = $activity_summary;
    19771968        }
    19781969    }
     
    25862577 * and removes the rest of the images from the string.
    25872578 *
     2579 * As of BuddyPress 2.3, this function is no longer in use.
     2580 *
    25882581 * @since BuddyPress (1.2.0)
    25892582 *
     
    26542647     */
    26552648    return apply_filters( 'bp_activity_thumbnail_content_images', $content, $matches, $args );
     2649}
     2650
     2651/**
     2652 * Create a rich summary of an activity item for the activity stream.
     2653 *
     2654 * More than just a simple excerpt, the summary could contain oEmbeds and other types of media.
     2655 * Currently, it's only used for blog post items, but it will probably be used for all types of
     2656 * activity in the future.
     2657 *
     2658 * @param string $content The content of the activity item.
     2659 * @param array $activity_args The data passed to bp_activity_add() or the values from an Activity obj.
     2660 * @return string
     2661 * @since BuddyPress (2.3.0)
     2662 */
     2663function bp_activity_create_summary( $content, $activity ) {
     2664    $args = array(
     2665        'width' => isset( $GLOBALS['content_width'] ) ? (int) $GLOBALS['content_width'] : 'medium',
     2666    );
     2667
     2668    // Get the WP_Post object if this activity type is a blog post.
     2669    if ( $activity['type'] === 'new_blog_post' ) {
     2670        $content = get_post( $activity['secondary_item_id'] );
     2671    }
     2672
     2673
     2674    /**
     2675     * Filter the class name of the media extractor when creating an Activity summary.
     2676     *
     2677     * Use this filter to change the media extractor used to extract media info for the activity item.
     2678     *
     2679     * @param string $extractor Class name.
     2680     * @param string $content The content of the activity item.
     2681     * @param array $activity The data passed to bp_activity_add() or the values from an Activity obj.
     2682     * @since BuddyPress (2.3.0)
     2683     */
     2684    $extractor = apply_filters( 'bp_activity_create_summary_extractor_class', 'BP_Media_Extractor', $content, $activity );
     2685    $extractor = new $extractor;
     2686
     2687    /**
     2688     * Filter the arguments passed to the media extractor when creating an Activity summary.
     2689     *
     2690     * @param array $args Array of bespoke data for the media extractor.
     2691     * @param string $content The content of the activity item.
     2692     * @param array $activity The data passed to bp_activity_add() or the values from an Activity obj.
     2693     * @param BP_Media_Extractor $extractor The media extractor object.
     2694     * @since BuddyPress (2.3.0)
     2695     */
     2696    $args = apply_filters( 'bp_activity_create_summary_extractor_args', $args, $content, $activity, $extractor );
     2697
     2698
     2699    // Extract media information from the $content.
     2700    $media = $extractor->extract( $content, BP_Media_Extractor::ALL, $args );
     2701
     2702    // If we converted $content to an object earlier, flip it back to a string.
     2703    if ( is_a( $content, 'WP_Post' ) ) {
     2704        $content = $content->post_content;
     2705    }
     2706
     2707    $para_count     = substr_count( strtolower( wpautop( $content ) ), '<p>' );
     2708    $has_audio      = ! empty( $media['has']['audio'] )           && $media['has']['audio'];
     2709    $has_videos     = ! empty( $media['has']['videos'] )          && $media['has']['videos'];
     2710    $has_feat_image = ! empty( $media['has']['featured_images'] ) && $media['has']['featured_images'];
     2711    $has_galleries  = ! empty( $media['has']['galleries'] )       && $media['has']['galleries'];
     2712    $has_images     = ! empty( $media['has']['images'] )          && $media['has']['images'];
     2713    $has_embeds     = false;
     2714
     2715    // Embeds must be subtracted from the paragraph count.
     2716    if ( ! empty( $media['has']['embeds'] ) ) {
     2717        $has_embeds = $media['has']['embeds'] > 0;
     2718        $para_count -= count( $media['has']['embeds'] );
     2719    }
     2720
     2721    $extracted_media = array();
     2722    $use_media_type  = '';
     2723    $image_source    = '';
     2724
     2725    // If it's a short article and there's an embed/audio/video, use it.
     2726    if ( $para_count <= 3 ) {
     2727        if ( $has_embeds ) {
     2728            $use_media_type = 'embeds';
     2729        } elseif ( $has_audio ) {
     2730            $use_media_type = 'audio';
     2731        } elseif ( $has_videos ) {
     2732            $use_media_type = 'videos';
     2733        }
     2734    }
     2735
     2736    // If not, or in any other situation, try to use an image.
     2737    if ( ! $use_media_type && $has_images ) {
     2738        $use_media_type = 'images';
     2739        $image_source   = 'html';
     2740   
     2741        // Featured Image > Galleries > inline <img>.
     2742        if ( $has_feat_image ) {
     2743            $image_source = 'featured_images';
     2744
     2745        } elseif ( $has_galleries ) {
     2746            $image_source = 'galleries';
     2747        }
     2748    }
     2749
     2750    // Extract an item from the $media results.
     2751    if ( $use_media_type ) {
     2752        if ( $use_media_type === 'images' ) {
     2753            $extracted_media = wp_list_filter( $media[ $use_media_type ], array( 'source' => $image_source ) );
     2754            $extracted_media = array_shift( $extracted_media );
     2755        } else {
     2756            $extracted_media = array_shift( $media[ $use_media_type ] );
     2757        }
     2758
     2759        /**
     2760         * Filter the results of the media extractor when creating an Activity summary.
     2761         *
     2762         * @param array $extracted_media Extracted media item. See {@link BP_Media_Extractor::extract()} for format.
     2763         * @param string $content Content of the activity item.
     2764         * @param array $activity The data passed to bp_activity_add() or the values from an Activity obj.
     2765         * @param array $media All results from the media extraction. See {@link BP_Media_Extractor::extract()} for format.
     2766         * @param string $use_media_type The kind of media item that was preferentially extracted.
     2767         * @param string $image_source If $use_media_type was "images", the preferential source of the image.
     2768         *               Otherwise empty.
     2769         * @since BuddyPress (2.3.0)
     2770         */
     2771        $extracted_media = apply_filters(
     2772            'bp_activity_create_summary_extractor_result',
     2773            $extracted_media,
     2774            $content,
     2775            $activity,
     2776            $media,
     2777            $use_media_type,
     2778            $image_source
     2779        );
     2780    }
     2781
     2782    // Generate a text excerpt for this activity item (and remove any oEmbeds URLs).
     2783    $summary = strip_shortcodes( html_entity_decode( strip_tags( $content ) ) );
     2784    $summary = bp_create_excerpt( preg_replace( '#^\s*(https?://[^\s"]+)\s*$#im', '', $summary ) );
     2785
     2786    if ( $use_media_type === 'embeds' ) {
     2787        $summary .= PHP_EOL . PHP_EOL . $extracted_media['url'];
     2788    } elseif ( $use_media_type === 'images' ) {
     2789        $summary .= sprintf( ' <img src="%s">', esc_url( $extracted_media['url'] ) );
     2790    } elseif ( in_array( $use_media_type, array( 'audio', 'videos' ), true ) ) {
     2791        $summary .= PHP_EOL . PHP_EOL . $extracted_media['original'];  // Full shortcode.
     2792    }
     2793
     2794    /**
     2795     * Filters the newly-generated summary for the activity item.
     2796     *
     2797     * @param string $summary Activity summary HTML.
     2798     * @param string $content $content Content of the activity item.
     2799     * @param array $activity The data passed to bp_activity_add() or the values from an Activity obj.
     2800     * @param array $extracted_media Media item extracted. See {@link BP_Media_Extractor::extract()} for format.
     2801     * @since BuddyPress (2.3.0)
     2802     */
     2803    return apply_filters( 'bp_activity_create_summary', $summary, $content, $activity, $extracted_media );
    26562804}
    26572805
  • trunk/src/bp-blogs/bp-blogs-activity.php

    r9471 r9621  
    353353    $r = wp_parse_args( $args, $defaults );
    354354
    355     // Remove large images and replace them with just one image thumbnail
    356     if ( ! empty( $r['content'] ) ) {
    357         $r['content'] = bp_activity_thumbnail_content_images( $r['content'], $r['primary_link'], $r );
    358     }
    359 
    360355    if ( ! empty( $r['action'] ) ) {
    361356
     
    377372         * @since BuddyPress (1.2.0)
    378373         *
    379          * @param string $value Generated excerpt from content for the activity stream.
     374         * @param string $value Generated summary from content for the activity stream.
    380375         * @param string $value Content for the activity stream.
    381376         * @param array  $r     Array of arguments used for the activity stream item.
    382377         */
    383         $r['content'] = apply_filters( 'bp_blogs_record_activity_content', bp_create_excerpt( $r['content'] ), $r['content'], $r );
     378        $r['content'] = apply_filters( 'bp_blogs_record_activity_content', bp_activity_create_summary( $r['content'], $r ), $r['content'], $r );
    384379    }
    385380
Note: See TracChangeset for help on using the changeset viewer.