PodsAPI::delete_relationships PHP Method

delete_relationships() public method

Delete relationships
Since: 2.3
public delete_relationships ( integer | array $related_id, integer | array $id, array $related_pod, array $related_field ) : void
$related_id integer | array IDs for items to save
$id integer | array ID or IDs to remove
$related_pod array Pod data
$related_field array Field data
return void
    public function delete_relationships($related_id, $id, $related_pod, $related_field)
    {
        if (is_array($related_id)) {
            foreach ($related_id as $rid) {
                $this->delete_relationships($rid, $id, $related_pod, $related_field);
            }
            return;
        }
        if (is_array($id)) {
            foreach ($id as $rid) {
                $this->delete_relationships($related_id, $rid, $related_pod, $related_field);
            }
            return;
        }
        $id = (int) $id;
        if (empty($id)) {
            return;
        }
        $related_ids = $this->lookup_related_items($related_field['id'], $related_pod['id'], $related_id, $related_field, $related_pod);
        if (empty($related_ids)) {
            return;
        } elseif (!in_array($id, $related_ids)) {
            return;
        }
        if (isset(self::$related_item_cache[$related_pod['id']][$related_field['id']])) {
            // Delete relationship from cache
            unset(self::$related_item_cache[$related_pod['id']][$related_field['id']]);
        }
        unset($related_ids[array_search($id, $related_ids)]);
        $no_conflict = pods_no_conflict_check($related_pod['type']);
        if (!$no_conflict) {
            pods_no_conflict_on($related_pod['type']);
        }
        // Post Types, Media, Users, and Comments (meta-based)
        if (in_array($related_pod['type'], array('post_type', 'media', 'taxonomy', 'user', 'comment'))) {
            $object_type = $related_pod['type'];
            if (in_array($object_type, array('post_type', 'media'))) {
                $object_type = 'post';
            } elseif ('taxonomy' == $object_type) {
                $object_type = 'term';
            }
            delete_metadata($object_type, $related_id, $related_field['name']);
            if (!empty($related_ids)) {
                update_metadata($object_type, $related_id, '_pods_' . $related_field['name'], $related_ids);
                foreach ($related_ids as $rel_id) {
                    add_metadata($object_type, $related_id, $related_field['name'], $rel_id);
                }
            } else {
                delete_metadata($object_type, $related_id, '_pods_' . $related_field['name']);
            }
        } elseif ('settings' == $related_pod['type']) {
            if (!empty($related_ids)) {
                update_option($related_pod['name'] . '_' . $related_field['name'], $related_ids);
            } else {
                delete_option($related_pod['name'] . '_' . $related_field['name']);
            }
        }
        // Relationships table
        if (!pods_tableless()) {
            pods_query("\n                DELETE FROM `@wp_podsrel`\n                WHERE\n                (\n                    `pod_id` = %d\n                    AND `field_id` = %d\n                    AND `item_id` = %d\n                    AND `related_item_id` = %d\n                )\n                OR (\n                    `related_pod_id` = %d\n                    AND `related_field_id` = %d\n                    AND `related_item_id` = %d\n                    AND `item_id` = %d\n                )\n            ", array($related_pod['id'], $related_field['id'], $related_id, $id, $related_pod['id'], $related_field['id'], $related_id, $id));
        }
        if (!$no_conflict) {
            pods_no_conflict_off($related_pod['type']);
        }
    }

Usage Example

 /**
  * Delete the value from the DB
  *
  * @param int $id
  * @param string $name
  * @param array $options
  * @param array $pod
  *
  * @since 2.3
  */
 public function delete($id = null, $name = null, $options = null, $pod = null)
 {
     if (empty(self::$api)) {
         self::$api = pods_api();
     }
     $simple_tableless_objects = $this->simple_objects();
     // Bidirectional relationship requirement checks
     $related_object = pods_var(self::$type . '_object', $options, '');
     // pod, post_type, taxonomy, etc..
     $related_val = pods_var(self::$type . '_val', $options, $related_object, null, true);
     // pod name, post type name, taxonomy name, etc..
     $related_sister_id = (int) pods_var('sister_id', $options, 0);
     if (!empty($related_sister_id) && !in_array($related_object, $simple_tableless_objects)) {
         $related_pod = self::$api->load_pod(array('name' => $related_val, 'table_info' => false), false);
         if (false !== $related_pod && ('pod' == $related_object || $related_object == $related_pod['type'])) {
             $related_field = false;
             // Ensure sister_id exists on related Pod
             foreach ($related_pod['fields'] as $related_pod_field) {
                 if ('pick' == $related_pod_field['type'] && $related_sister_id == $related_pod_field['id']) {
                     $related_field = $related_pod_field;
                     break;
                 }
             }
             if (!empty($related_field)) {
                 $values = self::$api->lookup_related_items($options['id'], $pod['id'], $id, $options, $pod);
                 if (!empty($values)) {
                     $no_conflict = pods_no_conflict_check($related_pod['type']);
                     if (!$no_conflict) {
                         pods_no_conflict_on($related_pod['type']);
                     }
                     self::$api->delete_relationships($values, $id, $related_pod, $related_field);
                     if (!$no_conflict) {
                         pods_no_conflict_off($related_pod['type']);
                     }
                 }
             }
         }
     }
 }