2013-04-02 2 views
0

에 XML 그것은 당신의 BuddyPress에 그룹 제작자와 관리자를 제공Buddypress 플러그인 버그 - PHP

플러그인 외부 그룹 블로그 외부 블로그 RSS를 부착 할 수있는 능력 그룹에 피드를 설치합니다.
블로그 게시물이 그룹의 활동 스트림에 표시됩니다.
새 게시물은 매 시간마다 자동으로 가져 오거나 누군가 특정 그룹 페이지를 방문하면 30 분마다 자동으로 가져옵니다.

내가 발견 한 버그가 너무 많습니다.
1) 자동으로 피드를 가져 오지 않습니다. 2) 피드를 수동으로 업데이트하려고하면 동일한 항목이 다시 게시됩니다. 즉, 새 피드를 가져 오지 못하고 있음을 의미합니다. 3) WordPress 관리 표시 줄도이 플러그인에서 제대로 작동하지 않습니다.

이 플러그인에는 2 개의 웹 페이지가 있습니다.

우선 메인 페이지는

<?php 

/* 
Plugin Name: External Group Blogs 
Plugin URI: http://wordpress.org/extend/plugins/external-group-blogs/ 
Description: Allow group creators to supply external blog RSS feeds that will attach  future posts on blogs to a group. 
*/ 

/* Only load the plugin functions if BuddyPress is loaded and initialized. */ 
function bp_groupblogs_init() { 
require(dirname(__FILE__) . '/bp-groups-externalblogs.php'); 
} 
add_action('bp_init', 'bp_groupblogs_init'); 

/* On activation register the cron to refresh external blog posts. */ 
function bp_groupblogs_activate() { 
wp_schedule_event(time(), 'hourly', 'bp_groupblogs_cron'); 
} 
register_activation_hook(__FILE__, 'bp_groupblogs_activate'); 

/* On deacativation, clear the cron. */ 
function bp_groupblogs_deactivate() { 
wp_clear_scheduled_hook('bp_groupblogs_cron'); 

/* Remove all external blog activity */ 
if (function_exists('bp_activity_delete')) 
    bp_activity_delete(array('type' => 'exb')); 
} 
register_deactivation_hook(__FILE__, 'bp_groupblogs_deactivate'); 

?> 

loader.php입니다 그리고 두번째 파일은 BP-그룹-externalblogs.php

<?php 
/* Group blog extension using the BuddyPress group extension API */ 
if (class_exists('BP_Group_Extension')) { 

class Group_External_Blogs extends BP_Group_Extension { 
    function __construct() { 
     global $bp; 
     $this->name = __('External Blogs', 'bp-groups-externalblogs'); 
     $this->slug = 'external-blog-feeds'; 
     $this->create_step_position = 21; 
     $this->enable_nav_item = false; 
    } 
    function create_screen() { 
     global $bp; 
     if (!bp_is_group_creation_step($this->slug)) 
      return false; 
     ?> 
     <p><?php _e(
      "Add RSS feeds of blogs you'd like to attach to this group in the box below. 
      Any future posts on these blogs will show up on the group page and be recorded 
      in activity streams.", 'bp-groups-externalblogs') ?> 
     </p> 
     <p class="desc"><?php _e("Seperate URL's with commas.", 'bp-groups-externalblogs') ?></span> 
     <p> 
      <label for="blogfeeds"><?php _e("Feed URL's:", 'bp-groups-externalblogs') ?></label> 
      <textarea name="blogfeeds" id="blogfeeds"><?php echo attribute_escape(implode(', ', (array)groups_get_groupmeta($bp->groups->current_group->id, 'blogfeeds'))) ?></textarea> 
     </p> 
     <?php 
     wp_nonce_field('groups_create_save_' . $this->slug); 
    } 
    function create_screen_save() { 
     global $bp; 
     check_admin_referer('groups_create_save_' . $this->slug); 
     $unfiltered_feeds = explode(',', $_POST['blogfeeds']); 
     foreach((array) $unfiltered_feeds as $blog_feed) { 
      if (!empty($blog_feed)) 
       $blog_feeds[] = trim($blog_feed); 
     } 
     groups_update_groupmeta($bp->groups->current_group->id, 'blogfeeds', $blog_feeds); 
     groups_update_groupmeta($bp->groups->current_group->id, 'bp_groupblogs_lastupdate', gmdate("Y-m-d H:i:s")); 
     /* Fetch */ 
     bp_groupblogs_fetch_group_feeds($bp->groups->current_group->id); 
    } 
    function edit_screen() { 
     global $bp; 
     if (!bp_is_group_admin_screen($this->slug)) 
      return false; ?> 
     <p class="desc"><?php _e("Enter RSS feed URL's for blogs you would like to attach to this group. Any future posts on these blogs will show on the group activity stream. Seperate URL's with commas.", 'bp-groups-externalblogs') ?></span> 
     <p> 
      <label for="blogfeeds"><?php _e("Feed URL's:", 'bp-groups-externalblogs') ?></label> 
      <textarea name="blogfeeds" id="blogfeeds"><?php echo attribute_escape(implode(', ', (array)groups_get_groupmeta($bp->groups->current_group->id, 'blogfeeds'))) ?></textarea> 
     </p> 
     <input type="submit" name="save" value="<?php _e("Update Feed URL's", 'bp-groups-externalblogs') ?>" /> 
     <?php 
     wp_nonce_field('groups_edit_save_' . $this->slug); 
    } 
    function edit_screen_save() { 
     global $bp; 
     if (!isset($_POST['save'])) 
      return false; 
     check_admin_referer('groups_edit_save_' . $this->slug); 
     $existing_feeds = (array)groups_get_groupmeta($bp->groups->current_group->id, 'blogfeeds'); 
     $unfiltered_feeds = explode(',', $_POST['blogfeeds']); 
     foreach((array) $unfiltered_feeds as $blog_feed) { 
      if (!empty($blog_feed)) 
       $blog_feeds[] = trim($blog_feed); 
     } 
     /* Loop and find any feeds that have been removed, so we can delete activity stream items */ 
     if (!empty($existing_feeds)) { 
      foreach((array) $existing_feeds as $feed) { 
       if (!in_array($feed, (array) $blog_feeds)) 
        $removed[] = $feed; 
      } 
     } 
     if ($removed ) { 
      /* Remove activity stream items for this feed */ 
      include_once(ABSPATH . WPINC . '/rss.php'); 
      foreach((array) $removed as $feed) { 
       $rss = fetch_rss(trim($feed)); 
       if (function_exists('bp_activity_delete')) { 
        bp_activity_delete(array(
         'item_id' => $bp->groups->current_group->id, 
         'secondary_item_id' => wp_hash($rss->channel['link']), 
         'component' => $bp->groups->id, 
         'type' => 'exb' 
        )); 
       } 
      } 
     } 
     groups_update_groupmeta($bp->groups->current_group->id, 'blogfeeds', $blog_feeds); 
     groups_update_groupmeta($bp->groups->current_group->id, 'bp_groupblogs_lastupdate', gmdate("Y-m-d H:i:s")); 
     /* Re-fetch */ 
     bp_groupblogs_fetch_group_feeds($bp->groups->current_group->id); 
     bp_core_add_message(__('External blog feeds updated successfully!', 'bp-groups-externalblogs')); 
     bp_core_redirect(bp_get_group_permalink($bp->groups->current_group) . '/admin/' . $this->slug); 
    } 
    /* We don't need display functions since the group activity stream handles it all. */ 
    function display() {} 
    function widget_display() {} 
} 

bp_register_group_extension('Group_External_Blogs'); 

function bp_groupblogs_fetch_group_feeds($group_id = false) { 
    global $bp; 
    include_once(ABSPATH . 'wp-includes/rss.php'); 
    if (empty($group_id)) 
     $group_id = $bp->groups->current_group->id; 
    if ($group_id == $bp->groups->current_group->id) 
     $group = $bp->groups->current_group; 
    else 
     $group = new BP_Groups_Group($group_id); 
    if (!$group) 
     return false; 
    $group_blogs = groups_get_groupmeta($group_id, 'blogfeeds'); 
    $group_blogs = explode(";",$group_blogs[0]); 

    /* Set the visibility */ 
    $hide_sitewide = ('public' != $group->status) ? true : false; 
    foreach ((array) $group_blogs as $feed_url) { 
     $rss = fetch_feed(trim($feed_url)); 
     if (!is_wp_error($rss)) { 
      foreach ($rss->get_items(0,10) as $item) {; 
       $key = $item->get_date('U'); 
       $items[$key]['title'] = $item->get_title(); 
       $items[$key]['subtitle'] = $item->get_title(); 
       //$items[$key]['author'] = $item->get_author()->get_name(); 
       $items[$key]['blogname'] = $item->get_feed()->get_title(); 
       $items[$key]['link'] = $item->get_permalink(); 
       $items[$key]['blogurl'] = $item->get_feed()->get_link(); 
       $items[$key]['description'] = $item->get_description(); 
       $items[$key]['source'] = $item->get_source(); 
       $items[$key]['copyright'] = $item->get_copyright(); 
      } 
     } 
    } 
    if ($items) { 
     ksort($items); 
     $items = array_reverse($items, true); 
    } else { 
     return false; 
    } 
    /* Record found blog posts in activity streams */ 
    foreach ((array) $items as $post_date => $post) { 
     //var_dump($post); 
     if (substr($post['blogname'],0,7) == "Twitter") { 
      $activity_action = sprintf(__('%s from %s in the group %s', 'bp-groups-externalblogs'), '<a class="feed-link" href="' . esc_attr($post['link']) . '">Tweet</a>', '<a class="feed-author" href="' . esc_attr($post['blogurl']) . '">' . attribute_escape($post['blogname']) . '</a>', '<a href="' . bp_get_group_permalink($group) . '">' . attribute_escape($group->name) . '</a>'); 
     } else { 
      $activity_action = sprintf(__('Blog: %s from %s in the group %s', 'bp-groups-externalblogs'), '<a class="feed-link" href="' . esc_attr($post['link']) . '">' . esc_attr($post['title']) . '</a>', '<a class="feed-author" href="' . esc_attr($post['blogurl']) . '">' . attribute_escape($post['blogname']) . '</a>', '<a href="' . bp_get_group_permalink($group) . '">' . attribute_escape($group->name) . '</a>'); 
     } 

     $activity_content = '<div>' . strip_tags(bp_create_excerpt($post['description'], 175)) . '</div>'; 
     $activity_content = apply_filters('bp_groupblogs_activity_content', $activity_content, $post, $group); 
     /* Fetch an existing activity_id if one exists. */ 
     if (function_exists('bp_activity_get_activity_id')) 
      $id = bp_activity_get_activity_id(array('user_id' => false, 'action' => $activity_action, 'component' => $bp->groups->id, 'type' => 'exb', 'item_id' => $group_id, 'secondary_item_id' => wp_hash($post['blogurl']))); 
     /* Record or update in activity streams. */ 
     groups_record_activity(array(
      'id' => $id, 
      'user_id' => false, 
      'action' => $activity_action, 
      'content' => $activity_content, 
      'primary_link' => $item->get_link(), 
      'type' => 'exb', 
      'item_id' => $group_id, 
      'secondary_item_id' => wp_hash($post['blogurl']), 
      'recorded_time' => gmdate("Y-m-d H:i:s", $post_date), 
      'hide_sitewide' => $hide_sitewide 
     )); 
    } 
    return $items; 
} 

/* Add a filter option to the filter select box on group activity pages */ 
function bp_groupblogs_add_filter() { ?> 
    <option value="exb"><?php _e('External Blogs', 'bp-groups-externalblogs') ?></option><?php 
} 
add_action('bp_group_activity_filter_options', 'bp_groupblogs_add_filter'); 
add_action('bp_activity_filter_options', 'bp_groupblogs_add_filter'); 

/* Add a filter option groups avatar */ 
/* Fetch group twitter posts after 30 mins expires and someone hits the group page */ 
function bp_groupblogs_refetch() { 
    global $bp; 
    $last_refetch = groups_get_groupmeta($bp->groups->current_group->id, 'bp_groupblogs_lastupdate'); 
    if (strtotime(gmdate("Y-m-d H:i:s")) >= strtotime('+30 minutes', strtotime($last_refetch))) 
     add_action('wp_footer', 'bp_groupblogs_refetch'); 
    /* Refetch the latest group twitter posts via AJAX so we don't stall a page load. */ 
    function _bp_groupblogs_refetch() { 
     global $bp; ?> 
     <script type="text/javascript"> 
      jQuery(document).ready(function() { 
       jQuery.post(ajaxurl, { 
        action: 'refetch_groupblogs', 
        'cookie': encodeURIComponent(document.cookie), 
        'group_id': <?php echo $bp->groups->current_group->id ?> 
       }); 
      }); 
     </script><?php 
     groups_update_groupmeta($bp->groups->current_group->id, 'bp_groupblogs_lastupdate', gmdate("Y-m-d H:i:s")); 
    } 
} 
add_action('groups_screen_group_home', 'bp_groupblogs_refetch'); 

/* Refresh via an AJAX post for the group */ 
function bp_groupblogs_ajax_refresh() { 
    bp_groupblogs_fetch_group_feeds($_POST['group_id']); 
} 
add_action('wp_ajax_refetch_groupblogs', 'bp_groupblogs_ajax_refresh'); 

function bp_groupblogs_cron_refresh() { 
    global $bp, $wpdb; 
    $group_ids = $wpdb->get_col($wpdb->prepare("SELECT group_id FROM " . $bp->groups->table_name_groupmeta . " WHERE meta_key = 'blogfeeds'")); 
    foreach($group_ids as $group_id) 
     bp_groupblogs_fetch_group_feeds($group_id); 
} 
add_action('bp_groupblogs_cron', 'bp_groupblogs_cron_refresh'); 
} 

// Add a filter option groups avatar 
function bp_groupblogs_avatar_type($var) { 
global $activities_template, $bp; 

if ($activities_template->activity->type == "exb") { 
    return 'group'; 
} else { 
    return $var; 
} 
} 
add_action('bp_get_activity_avatar_object_groups', 'bp_groupblogs_avatar_type'); 
add_action('bp_get_activity_avatar_object_activity', 'bp_groupblogs_avatar_type'); 

function bp_groupblogs_avatar_id($var) { 
global $activities_template, $bp; 

if ($activities_template->activity->type == "exb") { 
    return $activities_template->activity->item_id; 
} 

return $var; 

} 
add_action('bp_get_activity_avatar_item_id', 'bp_groupblogs_avatar_id'); 

?> 

내가 활동 스트림에서 반복 데이터를 중단을위한 제안이있다 . 어쩌면 wp-cron api를 사용하고 현재 날짜 xml은 하루에 한 번 시스템을 가져옵니다. 따라서 그룹 활동 스트림에서 동일한 피드를 반복하지 않습니다. 우리는 bp 그룹 활동 스트림에서 데이터 반복을 중지 할 수있는 기준이 필요합니다. 그것은 내 프로젝트의 일부입니다. 피드를 가져 와서 그룹 활동 스트림의 mysql 테이블에 저장 한 다음 최신 그룹 업데이트로 표시하는 다른 방법이 있습니까?

+0

우리는 버디 미디어와 비슷한 문제가 있습니다. 우리가 뭘 수정했는지 알아? 우리는 친구 미디어 사용을 중단했습니다. –

+0

그는 ...하지만이 플러그인이 필요합니다. buddypress에이 플러그인을 대체 할 수 없습니다. – Kapil

+0

질문에 좀 더 구체적이어야합니다. 전혀 질문이 있다면 ... 이것은 다른 프로그래머가 당신을 위해 일하는 곳이 아닙니다. 미안합니다. –

답변

0

실제로 IT가 자동으로 가져옵니다. 플러그인에서 cron 사용법을 봅니다. WordPress Cron은 사용자가 사이트를 열 때만 실행됩니다. 따라서 어떤 사용자 (페이지 뷰 없음)도 cron 활동이 없습니다. 모든 페이지 뷰에서 WP-Cron은 모든 기능을 수행 할 시간이 왔는지 여부를 확인합니다.

아마도 this plugin은 별도의 그룹 탭에 RSS 피드를 약간 표시하는 데 도움이됩니다.

+0

이것은 아주 좋은 플러그인이지만 문제가있다. 나는 RSS 피드를 원한다. 내 그룹 활동 스트림을 사용하면 사용자는 게시 된 피드에서 좋아하거나 댓글을 달거나 좋아할 수 있습니다. 그게 필요합니다. 그것을 추가 할 수는 있지만 어쨌든 좋은 스크립트입니다 – Kapil

+0

플러그인이 실시간으로 피드를 가져 와서 그룹 RSS 탭에 표시합니다. 페이지 매김도 작동하지 않습니다 ... 참조 이 http://www.coolguruji.com/groups/hollywood/rss-posts/ – Kapil

+0

rss 피드의 10 개 항목 만 표시 될 예정이므로 아무 것도 표시하지 않을 것입니다. 저장하지 않음 - 예, 초기 기능이었습니다. –