Search code examples
wordpressbuddypress

How to add, save and loop over custom activity fields in buddypress?


Please help, I am trying to add some custom fields to the activity stream in buddypress but got stuck...

The following code adds two fields successfully to the activity form:

//add fields to activity
function add_activity_extra_fields(){
  echo
  '<div id="activitty-form-extra-fields">
    <input type="url" data-clear-btn="false" name="activity-form-field-url" id="activity-form-field-url" value=""   placeholder="Insert link...">  
    <input type="date" name="activity-form-field-date" id="activity-form-field-date" value="" placeholder="Insert expiry.. ."/>
  </div>';
} add_action ( "bp_activity_post_form_options", 'add_activity_extra_fields' );

Then I can read from $_POST and save to a custom table, but it's not working:

//save fields from activity
function save_activity_extra_fields( $content ) {
  global $wpdb;
  
  //$act_id = $_POST['activity-form-field-date'];
  $usr_id = $_POST['user_id'];
  $date = $_POST['activity-form-field-date'];
  $url = $_POST['activity-form-field-url'];

  $wpdb->insert(
    'jrh_bp_activity_extra',
    array( 'user_id' => $usr_id, 'date' => $date, 'url' => $url ),
    array( '%s' ),
  );

} add_action('bp_activity_posted_update', 'save_activity_extra_fields');

Solution

  • I add the fields to the activity form like so:

    function add_activity_extra_fields(){
      echo
      '<div id="activitty-form-extra-fields">
        <input type="url" data-clear-btn="false" name="activity-form-field-url" id="activity-form-field-url" value=""   placeholder="Inserisci link...">  
        <input type="date" name="activity-form-field-date" id="activity-form-field-date" value="" placeholder="Inserisci scadenza.. ."/>
      </div>';
    } add_action ( "bp_activity_post_form_options", 'add_activity_extra_fields' );
    

    Then save to a custom table:

    function save_activity_extra_fields( $activity ) {
      global $wpdb;
      
      $activity_id = $activity -> id;
      $url = $_POST['activity-form-field-url'];
      $date = $_POST['activity-form-field-date'];
      
      $save = $wpdb->insert(
        'jrh_bp_activity_extra',
        array( 'activity_id' => $activity_id, 'date' => $date, 'url' => $url ),
        array( '%d', '%s', '%s' ),
      );
    
    } add_action('bp_activity_after_save', 'save_activity_extra_fields');
    

    Finally retrieve with the following function...

    function read_activity_extra_fields() {
      global $activities_template;
      global $wpdb;
      
      $id = $activities_template->activity->id;  
      
      $url = $wpdb->get_results( "SELECT url FROM `jrh_bp_activity_extra` WHERE activity_id = $id" );
      $date = $wpdb->get_results( "SELECT date FROM `jrh_bp_activity_extra` WHERE activity_id = $id" );
      
      $extra_fields = (object) array( 'url' => $url[0]->url, 'date' => $date[0]->date);
      
      return $extra_fields;
    }
    

    Unfortunately I couldn't find a better way, so I just call it from my custom entry.php template

    <div class="activity-inner-wish-extra">
        <?php 
            $extra_fields = read_activity_extra_fields();
    
            if ( isset($extra_fields->url) ) :
                echo '<p class="wish-url">'; echo $extra_fields->url; echo '</p>';
            endif;
            
            if ( isset($extra_fields->date) ) :
                echo '<p class="wish-expiry">'; echo $extra_fields->date; echo '</p>';
            endif;
        ?>
    </div>