Skip to:
Content

BuddyPress.org

Ticket #5328: 5328.diff

File 5328.diff, 16.2 KB (added by imath, 8 years ago)
  • bp-activity/bp-activity-classes.php

     
    984984                                $filter_sql[] = $sid_sql;
    985985                }
    986986
     987                if ( !empty( $filter_array['date_recorded'] ) ) {
     988                        $sid_sql = date_i18n( 'Y-m-d H:i:s', intval( $filter_array['date_recorded'] ) );
     989                        $filter_sql[] = "a.date_recorded > '" . esc_sql( $sid_sql ) . "'" ;
     990                }
     991
    987992                if ( empty( $filter_sql ) )
    988993                        return false;
    989994
     
    10041009        }
    10051010
    10061011        /**
     1012         * Get the timestamp of the last recorded activity depending on the context
     1013         *
     1014         * @since  BuddyPress (?)
     1015         *
     1016         * @param  array  $args
     1017         * @return integer       timestamp
     1018         */
     1019        public static function get_lastest_recorded( $args = array() ) {
     1020                global $bp, $wpdb;
     1021
     1022                $defaults = array(
     1023                        'search_terms'     => false,
     1024                        'filter'           => false,      // See self::get_filter_sql()
     1025                        'display_comments' => 'threaded', // or stream or false
     1026                        'show_hidden'      => false,      // Show items marked hide_sitewide
     1027                );
     1028
     1029                $r = bp_parse_args( $args, $defaults, 'activity_latest_recorded' );
     1030                extract( $r );
     1031
     1032                $select_sql = "SELECT a.date_recorded FROM {$bp->activity->table_name} a";
     1033                $order_sql  = "ORDER BY date_recorded DESC";
     1034                $limit_sql  = "LIMIT 1";
     1035
     1036                $where_conditions['spam_sql'] = 'a.is_spam = 0';
     1037
     1038                // Searching
     1039                if ( $search_terms ) {
     1040                        $search_terms = esc_sql( $search_terms );
     1041                        $where_conditions['search_sql'] = "a.content LIKE '%%" . esc_sql( like_escape( $search_terms ) ) . "%%'";
     1042                }
     1043
     1044                // Filtering
     1045                if ( $filter && $filter_sql = BP_Activity_Activity::get_filter_sql( $filter ) )
     1046                        $where_conditions['filter_sql'] = $filter_sql;
     1047
     1048                if ( !$show_hidden )
     1049                        $where_conditions['hidden_sql'] = "a.hide_sitewide = 0";
     1050               
     1051                if ( false === $display_comments || 'threaded' === $display_comments ) {
     1052                        $where_conditions[] = "a.type != 'activity_comment'";
     1053                }
     1054
     1055                // Filter the where conditions
     1056                $where_conditions = apply_filters( 'bp_activity_get_lastest_recorded_where', $where_conditions, $r );
     1057
     1058                // Join the where conditions together
     1059                $where_sql = 'WHERE ' . join( ' AND ', $where_conditions );
     1060
     1061                $last_recorded = $wpdb->get_var( apply_filters( 'bp_activity_get_lastest_sql', "{$select_sql} {$where_sql} {$order_sql} {$limit_sql}", $select_sql, $where_sql, $order_sql ) );
     1062               
     1063                return !empty( $last_recorded ) ? strtotime( $last_recorded ) : false;
     1064        }
     1065
     1066        /**
    10071067         * Get favorite count for a given user.
    10081068         *
    10091069         * @since BuddyPress (1.2)
  • bp-activity/bp-activity-filters.php

     
    376376
    377377        return apply_filters( 'bp_activity_truncate_entry', $excerpt, $text, $append_text );
    378378}
     379
     380
     381/**
     382 * Adds a just-posted class to avoid some mess in activity ajax pagination
     383 *
     384 * @since  BuddyPress (?)
     385 * @param  string $classes
     386 * @return string $classes
     387 */
     388function bp_activity_newest_class( $classes = '' ) {
     389        $classes .= ' just-posted';
     390        return $classes;
     391}
     392
     393/**
     394 * Uses WordPress Heartbeat API to check for latest activity update in BP Activity Admin screen
     395 *
     396 * @uses  bp_activity_get_last_updated() to get the recorded date of the last activity
     397 *
     398 * @param  array  $response
     399 * @param  array  $data
     400 * @return array  $response
     401 */
     402function bp_activity_heartbeat_last_recorded( $response = array(), $data = array() ) {
     403        $bp = buddypress();
     404       
     405        if( isset( $data['bp_last_activity_update'] ) && 'bp_activity_heartbeat_front' == $data['bp_last_activity_update']['id'] ) {
     406                $filter = array();
     407                $show_hidden = false;
     408
     409                if( !empty( $data['bp_last_activity_update']['action'] ) && '-1' != $data['bp_last_activity_update']['action'] )
     410                        $filter['action'] = $data['bp_last_activity_update']['action'];
     411
     412                if( !empty( $data['bp_last_activity_update']['scope'] ) && 'all' != $data['bp_last_activity_update']['scope'] )
     413                        $filter['object'] = $data['bp_last_activity_update']['scope'];
     414
     415                // Group filtering
     416                if ( !empty( $bp->groups->current_group ) ) {
     417                        $filter['object'] = $bp->groups->id;
     418                        $filter['primary_id'] = $bp->groups->current_group->id;
     419
     420                        if ( ( 'public' != $bp->groups->current_group->status ) && ( groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) || bp_current_user_can( 'bp_moderate' ) ) )
     421                                $show_hidden = true;
     422                }
     423
     424                $response['last_date_recorded'] = bp_activity_get_lastest_recorded(
     425                        array(
     426                                'search_terms' => $data['bp_last_activity_update']['search'],
     427                                'filter'       => $filter,
     428                                'show_hidden'  => $show_hidden
     429                        )
     430                );
     431        }
     432
     433        return $response;
     434}
     435
     436add_filter( 'heartbeat_received', 'bp_activity_heartbeat_last_recorded', 10, 2 );
     437add_filter( 'heartbeat_nopriv_received', 'bp_activity_heartbeat_last_recorded', 10, 2 );
     438
     439/**
     440 * Changes the pulse of the WP HeartBeat API where needed
     441 *
     442 * The filter should be initialized elsewhere to avoid the long check
     443 *
     444 * @since  BuddyPress (?)
     445 *
     446 * @param  array  $settings HeartBeat settings
     447 * @return array  HeartBeat settings
     448 */
     449function bp_activity_heartbeat_settings( $settings = array() ) {
     450        // ugly check
     451        if( ( bp_is_activity_component() && ! bp_displayed_user_id() && ! bp_current_action() ) || bp_is_group_activity() || bp_is_group_home() )               
     452        $settings['interval'] = 15;
     453   
     454    return $settings;
     455}
     456
     457add_filter( 'heartbeat_settings', 'bp_activity_heartbeat_settings', 10, 1 );
  • bp-activity/bp-activity-functions.php

     
    515515}
    516516
    517517/**
     518 * Retrieve the date of the latest date of the activity recorded.
     519 *
     520 * @since BuddyPress (?)
     521 *
     522 * @uses BP_Activity_Activity::get_lastest_recorded() {@link BP_Activity_Activity}
     523 * @uses apply_filters() To call the 'bp_activity_get_lastest_recorded' hook.
     524 *
     525 * @return int timestamp for the latest activity recorded.
     526 */
     527function bp_activity_get_lastest_recorded( $args = array() ) {
     528        return apply_filters( 'bp_activity_get_lastest_recorded', BP_Activity_Activity::get_lastest_recorded( $args ) );
     529}
     530
     531/**
    518532 * Retrieve the number of favorite activity stream items a user has.
    519533 *
    520534 * @since BuddyPress (1.2)
  • bp-activity/bp-activity-template.php

     
    519519                'action'           => false,        // action to filter on e.g. activity_update, new_forum_post, profile_updated
    520520                'primary_id'       => $primary_id,  // object ID to filter on e.g. a group_id or forum_id or blog_id etc.
    521521                'secondary_id'     => false,        // secondary object ID to filter on e.g. a post_id
     522                'date_recorded'    => false,        // to only get the activities newer than the value
    522523
    523524                'meta_query'       => false,        // filter on activity meta. See WP_Meta_Query for format
    524525
     
    536537                $display_comments = false;
    537538        }
    538539
     540        // if using WP HeartBeat, pagination might be a trouble..
     541        if( !empty( $date_recorded ) )
     542                $page = 0;
     543
    539544        if ( empty( $search_terms ) && ! empty( $_REQUEST['s'] ) )
    540545                $search_terms = $_REQUEST['s'];
    541546
     
    607612        // into bp-custom.php or your theme's functions.php
    608613        if ( isset( $_GET['afilter'] ) && apply_filters( 'bp_activity_enable_afilter_support', false ) )
    609614                $filter = array( 'object' => $_GET['afilter'] );
    610         else if ( !empty( $user_id ) || !empty( $object ) || !empty( $action ) || !empty( $primary_id ) || !empty( $secondary_id ) )
    611                 $filter = array( 'user_id' => $user_id, 'object' => $object, 'action' => $action, 'primary_id' => $primary_id, 'secondary_id' => $secondary_id );
    612         else
     615        else if ( !empty( $user_id ) || !empty( $object ) || !empty( $action ) || !empty( $primary_id ) || !empty( $secondary_id ) || !empty( $date_recorded ) )
     616                $filter = array( 'user_id' => $user_id, 'object' => $object, 'action' => $action, 'primary_id' => $primary_id, 'secondary_id' => $secondary_id, 'date_recorded' => $date_recorded );
     617        else
    613618                $filter = false;
    614619
    615620        // If specific activity items have been requested, override the $hide_spam argument. This prevents backpat errors with AJAX.
     
    741746function bp_activity_has_more_items() {
    742747        global $activities_template;
    743748
    744         $remaining_pages = floor( ( $activities_template->total_activity_count - 1 ) / ( $activities_template->pag_num * $activities_template->pag_page ) );
    745         $has_more_items  = (int) $remaining_pages ? true : false;
     749        $remaining_pages = !empty( $activities_template->pag_page ) ? floor( ( $activities_template->total_activity_count - 1 ) / ( $activities_template->pag_num * $activities_template->pag_page ) ) : false ;
     750        $has_more_items  = (int) $remaining_pages ? true : false;
    746751
    747752        return apply_filters( 'bp_activity_has_more_items', $has_more_items );
    748753}
     
    912917        }
    913918
    914919/**
     920 * Output the activity timestamp.
     921 *
     922 * @since BuddyPress (?)
     923 *
     924 * @uses bp_get_activity_timestamp()
     925 */
     926function bp_activity_timestamp() {
     927        echo bp_get_activity_timestamp();
     928}
     929       
     930        /**
     931         * Return the activity timestamp.
     932         *
     933         * @since BuddyPress (?)
     934         *
     935         * @global object $activities_template {@link BP_Activity_Template}
     936         * @uses apply_filters() To call the 'bp_get_activity_timestamp' hook.
     937         *
     938         * @return int The activity secondary item ID.
     939         */
     940        function bp_get_activity_timestamp() {
     941                global $activities_template;
     942                return apply_filters( 'bp_get_activity_timestamp', strtotime( $activities_template->activity->date_recorded ) );
     943        }
     944
     945/**
    915946 * Output the activity secondary item ID.
    916947 *
    917948 * @since BuddyPress (1.2)
  • bp-templates/bp-legacy/buddypress/activity/entry.php

     
    1414
    1515<?php do_action( 'bp_before_activity_entry' ); ?>
    1616
    17 <li class="<?php bp_activity_css_class(); ?>" id="activity-<?php bp_activity_id(); ?>">
     17<li class="<?php bp_activity_css_class(); ?>" id="activity-<?php bp_activity_id(); ?>" data-timestamp="<?php bp_activity_timestamp(); ?>">
    1818        <div class="activity-avatar">
    1919                <a href="<?php bp_activity_user_link(); ?>">
    2020
  • bp-templates/bp-legacy/buddypress-functions.php

     
    145145
    146146                        // Activity
    147147                        'activity_get_older_updates'  => 'bp_legacy_theme_activity_template_loader',
     148                        'activity_get_newer_updates'  => 'bp_legacy_theme_activity_template_loader',
    148149                        'activity_mark_fav'           => 'bp_legacy_theme_mark_activity_favorite',
    149150                        'activity_mark_unfav'         => 'bp_legacy_theme_unmark_activity_favorite',
    150151                        'activity_widget_filter'      => 'bp_legacy_theme_activity_template_loader',
     
    220221                // Locate the BP JS file
    221222                $asset = $this->locate_asset_in_stack( $file, 'js' );
    222223
     224                $js_dependencies = array( 'jquery' );
     225
     226                // ugly check to only load HeartBeat where needed
     227                if( ( bp_is_activity_component() && ! bp_displayed_user_id() && ! bp_current_action() ) || bp_is_group_activity() || bp_is_group_home() )
     228                        $js_dependencies[] = 'heartbeat';
     229
     230
    223231                // Enqueue the global JS, if found - AJAX will not work
    224232                // without it
    225233                if ( isset( $asset['location'], $asset['handle'] ) ) {
    226                         wp_enqueue_script( $asset['handle'], $asset['location'], array( 'jquery' ), $this->version );
     234                        wp_enqueue_script( $asset['handle'], $asset['location'], $js_dependencies, $this->version );
    227235                }
    228236
    229237                // Add words that we need to use in JS to the end of the page
     
    242250                        'show_x_comments'     => __( 'Show all %d comments', 'buddypress' ),
    243251                        'unsaved_changes'     => __( 'Your profile has unsaved changes. If you leave the page, the changes will be lost.', 'buddypress' ),
    244252                        'view'                => __( 'View', 'buddypress' ),
     253                        'newest'              => __( 'Load Newest', 'buddypress' ),
    245254                );
    246255                wp_localize_script( $asset['handle'], 'BP_DTheme', $params );
    247256
     
    480489                $qs[] = 'exclude=' . implode( ',', $just_posted );
    481490        }
    482491
     492        // to get newest activities
     493        if( !empty( $_POST['date_recorded'] ) )
     494                $qs[] = 'date_recorded=' . intval( $_POST['date_recorded'] );
     495
    483496        $object_search_text = bp_get_search_default_text( $object );
    484497        if ( ! empty( $_POST['search_terms'] ) && $object_search_text != $_POST['search_terms'] && 'false' != $_POST['search_terms'] && 'undefined' != $_POST['search_terms'] )
    485498                $qs[] = 'search_terms=' . $_POST['search_terms'];
     
    594607                        break;
    595608        }
    596609
     610        // needs a better way
     611        if( !empty( $_POST['action'] ) && 'activity_get_newer_updates' == $_POST['action'] )
     612                add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
     613
    597614        // Buffer the loop in the template to a var for JS to spit out.
    598615        ob_start();
    599616        bp_get_template_part( 'activity/activity-loop' );
     
    601618        $result['feed_url'] = apply_filters( 'bp_legacy_theme_activity_feed_url', $feed_url, $scope );
    602619        ob_end_clean();
    603620
     621        // needs a better way
     622        if( !empty( $_POST['action'] ) && 'activity_get_newer_updates' == $_POST['action'] )
     623                remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
     624
     625
    604626        exit( json_encode( $result ) );
    605627}
    606628
  • bp-templates/bp-legacy/css/buddypress.css

     
    290290        margin-left: 1em;
    291291        white-space: nowrap;
    292292}
    293 #buddypress .activity-list li.load-more {
     293#buddypress .activity-list li.load-more,
     294#buddypress .activity-list li.load-newest {
    294295        background: #f0f0f0;
    295296        font-size: 110%;
    296297        margin: 15px 0;
    297298        padding: 10px 15px;
    298299        text-align: center;
    299300}
    300 #buddypress .activity-list li.load-more a {
     301#buddypress .activity-list li.load-more a,
     302#buddypress .activity-list li.load-newest a {
    301303        color: #4D4D4D;
    302304}
    303305
  • bp-templates/bp-legacy/js/buddypress.js

     
    351351
    352352                        return false;
    353353                }
     354
     355                /* Load newest updates at the top of the list */
     356                if ( target.parent().hasClass('load-newest') ) {
     357
     358                        event.preventDefault();
     359                        timestamp = target.parent().next().data('timestamp');
     360
     361                        jq("#buddypress li.load-newest").addClass('loading');
     362
     363                        jq.post( ajaxurl, {
     364                                action: 'activity_get_newer_updates',
     365                                'cookie': bp_get_cookies(),
     366                                'page':-1,
     367                                'date_recorded': timestamp
     368                        },
     369                        function(response)
     370                        {
     371                                jq("#buddypress li.load-newest").removeClass('loading');
     372                                jq("#buddypress ul.activity-list").prepend(response.contents);
     373
     374                                target.parent().hide();
     375                        }, 'json' );
     376                }
    354377        });
    355378
    356379        // Activity "Read More" links
     
    13451368        /* if js is enabled then replace the no-js class by a js one */
    13461369        if( jq('body').hasClass('no-js') )
    13471370                jq('body').attr('class', jq('body').attr('class').replace( /no-js/,'js' ) );
     1371
     1372        /* Activity HeartBeat */
     1373        jq(document).on('heartbeat-send', function(e, data) {
     1374        data['bp_last_activity_update'] = {
     1375                'id'    : 'bp_activity_heartbeat_front',
     1376                'action': jq.cookie('bp-activity-filter'),
     1377                'search'   : '',
     1378                'scope' : jq.cookie('bp-activity-scope')
     1379        }
     1380    });
     1381
     1382        jq(document).on( 'heartbeat-tick', function(e, data) {
     1383
     1384                 // Only proceed if we have a last recorded date
     1385        if ( ! data['last_date_recorded'] )
     1386            return;
     1387
     1388        // the first row is the oldest activity
     1389        var firstrow = jq( '#buddypress ul.activity-list li' ).first();
     1390
     1391        if( firstrow.hasClass( 'load-newest' ) )
     1392                return;
     1393       
     1394        if( firstrow.data( 'timestamp' ) && data['last_date_recorded'] > firstrow.data( 'timestamp' ) ) {
     1395                jq( '#buddypress ul.activity-list' ).prepend( '<li class="load-newest"><a href="#newest">' + BP_DTheme.newest + '</a></li>' );
     1396        }
     1397
     1398    });
    13481399               
    13491400});
    13501401