使用 apply_filter 传递给另一个函数的对象值

Use object values passed into another function with apply_filter

首先,我要做的是插入一个 html 标签,然后我可以用 css 定位。

这是我必须使用的当前 html:

<p>
  <a href="https://account.danijohnson.com/members/rebecca-deacetis/">Rebecca DeAcetis</a>
    posted an update in the group 
  <a href="https://account.danijohnson.com/bb-groups/creating-a-dynasty-november-2020/">Creating a Dynasty™ November 2020</a>
  <a href="https://account.danijohnson.com/activity/p/6965/" class="view activity-time-since">. 
    <span class="time-since">2 days ago</span>
  </a>
</p>

我想要的是用 <span class="activity-action"></span>

包裹“在组中发布更新”

创建 html 的插件函数是:

/**
 * Format groups 'activity_update' activity actions.
 *
 * @since BuddyBoss 1.1.9
 *
 * @param string $action   Static activity action.
 * @param object $activity Activity data object.
 * @return string
 */
function bp_groups_format_activity_action_activity_update( $action, $activity ) {
    $user_link = bp_core_get_userlink( $activity->user_id );

    $group      = groups_get_group( $activity->item_id );
    $group_link = '<a href="' . esc_url( bp_get_group_permalink( $group ) ) . '">' . esc_html( $group->name ) . '</a>';

    $action = sprintf( __( '%1$s posted an update in the group %2$s', 'buddyboss' ), $user_link, $group_link );

    /**
     * Filters the groups 'activity_update' activity actions.
     *
     * @since BuddyBoss 1.1.9
     *
     * @param string $action   The groups 'activity_update' activity actions.
     * @param object $activity Activity data object.
     */
    return apply_filters( 'bp_groups_format_activity_action_activity_update', $action, $activity );
}

我试过将它添加到我的主题中 functions.php:

function add_span_to_timeline_action($action) {
  
  $action = sprintf( '%1$s<span class="activtiy-action"> posted in the group %2$s</span>', $user_link, $group_link );
  return $action;
}
add_filter('bp_groups_format_activity_action_activity_update','add_span_to_timeline_action');

它确实更新了 html 并添加了 <span> 标签,但是 <a> 元素不起作用,因为 $user_link 和 $group_link我的函数中没有定义变量。

我不知道如何使 $activity 对象在我的函数中可用,以便我可以定义 link 变量。

我知道用 javascript/jquery 完成我想要的 css 但我不想依赖它,因为 activity 在页面上加载并用 ajax 更新所以我必须有一个 setTimeout setInterval 以便 activity 加载,这将导致页面在加载后更新。

原始过滤器传递 $activity 变量,因此您也可以访问它:

function add_span_to_timeline_action($action, $activity) {

    $user_link = bp_core_get_userlink( $activity->user_id );

    $group      = groups_get_group( $activity->item_id );
    $group_link = '<a href="' . esc_url( bp_get_group_permalink( $group ) ) . '">' . esc_html( $group->name ) . '</a>';

    $action = sprintf( '%1$s<span class="activity-action"> posted in the group %2$s</span>', $user_link, $group_link );
    return $action;
}
add_filter('bp_groups_format_activity_action_activity_update','add_span_to_timeline_action', 10, 2);

只需确保更新 add_filter 上的参数计数(10 - 优先级,2 - 参数计数)