PodsAPI::get_wp_object_fields PHP Method

get_wp_object_fields() public method

Get a list of core WP object fields for a specific object
Since: 2.0
public get_wp_object_fields ( string $object = 'post_type', array $pod = null, boolean $refresh = false ) : array
$object string The pod type to look for, possible values: post_type, user, comment, taxonomy
$pod array Array of Pod data
$refresh boolean Whether to force refresh the information
return array Array of fields
    public function get_wp_object_fields($object = 'post_type', $pod = null, $refresh = false)
    {
        $pod_name = pods_var_raw('name', $pod, $object, null, true);
        if ('media' == $pod_name) {
            $object = 'post_type';
            $pod_name = 'attachment';
        }
        $fields = false;
        if (pods_api_cache()) {
            $fields = pods_transient_get(trim('pods_api_object_fields_' . $object . $pod_name . '_', '_'));
        }
        if (false !== $fields && !$refresh) {
            return $this->do_hook('get_wp_object_fields', $fields, $object, $pod);
        }
        $fields = array();
        if ('post_type' == $object) {
            $fields = array('ID' => array('name' => 'ID', 'label' => 'ID', 'type' => 'number', 'alias' => array('id'), 'options' => array('number_format' => '9999.99')), 'post_title' => array('name' => 'post_title', 'label' => 'Title', 'type' => 'text', 'alias' => array('title', 'name'), 'options' => array('display_filter' => 'the_title', 'display_filter_args' => array('post_ID'))), 'post_content' => array('name' => 'post_content', 'label' => 'Content', 'type' => 'wysiwyg', 'alias' => array('content'), 'options' => array('wysiwyg_allowed_html_tags' => '', 'display_filter' => 'the_content', 'pre_save' => 0)), 'post_excerpt' => array('name' => 'post_excerpt', 'label' => 'Excerpt', 'type' => 'paragraph', 'alias' => array('excerpt'), 'options' => array('paragraph_allow_html' => 1, 'paragraph_allowed_html_tags' => '', 'display_filter' => 'the_excerpt', 'pre_save' => 0)), 'post_author' => array('name' => 'post_author', 'label' => 'Author', 'type' => 'pick', 'alias' => array('author'), 'pick_object' => 'user', 'options' => array('pick_format_type' => 'single', 'pick_format_single' => 'autocomplete', 'default_value' => '{@user.ID}')), 'post_date' => array('name' => 'post_date', 'label' => 'Publish Date', 'type' => 'datetime', 'alias' => array('created', 'date')), 'post_date_gmt' => array('name' => 'post_date_gmt', 'label' => 'Publish Date (GMT)', 'type' => 'datetime', 'alias' => array(), 'hidden' => true), 'post_status' => array('name' => 'post_status', 'label' => 'Status', 'type' => 'pick', 'pick_object' => 'post-status', 'default' => $this->do_hook('default_status_' . $pod_name, pods_var('default_status', pods_var_raw('options', $pod), 'draft', null, true), $pod), 'alias' => array('status')), 'comment_status' => array('name' => 'comment_status', 'label' => 'Comment Status', 'type' => 'text', 'default' => get_option('default_comment_status', 'open'), 'alias' => array(), 'data' => array('open' => __('Open', 'pods'), 'closed' => __('Closed', 'pods'))), 'ping_status' => array('name' => 'ping_status', 'label' => 'Ping Status', 'default' => get_option('default_ping_status', 'open'), 'type' => 'text', 'alias' => array(), 'data' => array('open' => __('Open', 'pods'), 'closed' => __('Closed', 'pods'))), 'post_password' => array('name' => 'post_password', 'label' => 'Password', 'type' => 'text', 'alias' => array()), 'post_name' => array('name' => 'post_name', 'label' => 'Permalink', 'type' => 'slug', 'alias' => array('slug', 'permalink')), 'to_ping' => array('name' => 'to_ping', 'label' => 'To Ping', 'type' => 'text', 'alias' => array(), 'hidden' => true), 'pinged' => array('name' => 'pinged', 'label' => 'Pinged', 'type' => 'text', 'alias' => array(), 'hidden' => true), 'post_modified' => array('name' => 'post_modified', 'label' => 'Last Modified Date', 'type' => 'datetime', 'alias' => array('modified'), 'hidden' => true), 'post_modified_gmt' => array('name' => 'post_modified_gmt', 'label' => 'Last Modified Date (GMT)', 'type' => 'datetime', 'alias' => array(), 'hidden' => true), 'post_content_filtered' => array('name' => 'post_content_filtered', 'label' => 'Content (filtered)', 'type' => 'paragraph', 'alias' => array(), 'hidden' => true, 'options' => array('paragraph_allow_html' => 1, 'paragraph_oembed' => 1, 'paragraph_wptexturize' => 1, 'paragraph_convert_chars' => 1, 'paragraph_wpautop' => 1, 'paragraph_allow_shortcode' => 1, 'paragraph_allowed_html_tags' => '')), 'post_parent' => array('name' => 'post_parent', 'label' => 'Parent', 'type' => 'pick', 'pick_object' => 'post_type', 'pick_val' => '__current__', 'alias' => array('parent'), 'data' => array(), 'hidden' => true), 'guid' => array('name' => 'guid', 'label' => 'GUID', 'type' => 'text', 'alias' => array(), 'hidden' => true), 'menu_order' => array('name' => 'menu_order', 'label' => 'Menu Order', 'type' => 'number', 'alias' => array(), 'options' => array('number_format' => '9999.99')), 'post_type' => array('name' => 'post_type', 'label' => 'Type', 'type' => 'text', 'alias' => array('type'), 'hidden' => true), 'post_mime_type' => array('name' => 'post_mime_type', 'label' => 'Mime Type', 'type' => 'text', 'alias' => array(), 'hidden' => true), 'comment_count' => array('name' => 'comment_count', 'label' => 'Comment Count', 'type' => 'number', 'alias' => array(), 'hidden' => true));
            if (!empty($pod)) {
                $taxonomies = get_object_taxonomies($pod_name, 'objects');
                foreach ($taxonomies as $taxonomy) {
                    $fields[$taxonomy->name] = array('name' => $taxonomy->name, 'label' => $taxonomy->labels->name, 'type' => 'taxonomy', 'pick_object' => 'taxonomy', 'pick_val' => $taxonomy->name, 'alias' => array(), 'hidden' => true, 'options' => array('taxonomy_format_type' => 'multi'));
                }
            }
        } elseif ('user' == $object) {
            $fields = array('ID' => array('name' => 'ID', 'label' => 'ID', 'type' => 'number', 'alias' => array('id'), 'options' => array('number_format' => '9999.99')), 'user_login' => array('name' => 'user_login', 'label' => 'Title', 'type' => 'text', 'alias' => array('login'), 'options' => array('required' => 1)), 'user_nicename' => array('name' => 'user_nicename', 'label' => 'Permalink', 'type' => 'slug', 'alias' => array('nicename', 'slug', 'permalink')), 'display_name' => array('name' => 'display_name', 'label' => 'Display Name', 'type' => 'text', 'alias' => array('title', 'name')), 'user_pass' => array('name' => 'user_pass', 'label' => 'Password', 'type' => 'text', 'alias' => array('password', 'pass'), 'options' => array('required' => 1, 'text_format_type' => 'password')), 'user_email' => array('name' => 'user_email', 'label' => 'E-mail', 'type' => 'text', 'alias' => array('email'), 'options' => array('required' => 1, 'text_format_type' => 'email')), 'user_url' => array('name' => 'user_url', 'label' => 'URL', 'type' => 'text', 'alias' => array('url', 'website'), 'options' => array('required' => 0, 'text_format_type' => 'website', 'text_format_website' => 'normal')), 'user_registered' => array('name' => 'user_registered', 'label' => 'Registration Date', 'type' => 'date', 'alias' => array('created', 'date', 'registered'), 'options' => array('date_format_type' => 'datetime')));
        } elseif ('comment' == $object) {
            $fields = array('comment_ID' => array('name' => 'comment_ID', 'label' => 'ID', 'type' => 'number', 'alias' => array('id', 'ID', 'comment_id'), 'options' => array('number_format' => '9999.99')), 'comment_content' => array('name' => 'comment_content', 'label' => 'Content', 'type' => 'wysiwyg', 'alias' => array('content')), 'comment_approved' => array('name' => 'comment_approved', 'label' => 'Approved', 'type' => 'number', 'alias' => array('approved'), 'options' => array('number_format' => '9999.99')), 'comment_post_ID' => array('name' => 'comment_post_ID', 'label' => 'Post', 'type' => 'pick', 'alias' => array('post', 'post_id'), 'data' => array()), 'user_id' => array('name' => 'user_id', 'label' => 'Author', 'type' => 'pick', 'alias' => array('author'), 'pick_object' => 'user', 'data' => array()), 'comment_date' => array('name' => 'comment_date', 'label' => 'Date', 'type' => 'date', 'alias' => array('created', 'date'), 'options' => array('date_format_type' => 'datetime')), 'comment_author' => array('name' => 'comment_author', 'label' => 'Author', 'type' => 'text', 'alias' => array('author')), 'comment_author_email' => array('name' => 'comment_author_email', 'label' => 'Author E-mail', 'type' => 'email', 'alias' => array('author_email')), 'comment_author_url' => array('name' => 'comment_author_url', 'label' => 'Author URL', 'type' => 'text', 'alias' => array('author_url')), 'comment_author_IP' => array('name' => 'comment_author_IP', 'label' => 'Author IP', 'type' => 'text', 'alias' => array('author_IP')), 'comment_type' => array('name' => 'comment_type', 'label' => 'Type', 'type' => 'text', 'alias' => array('type'), 'hidden' => true), 'comment_parent' => array('name' => 'comment_parent', 'label' => 'Parent', 'type' => 'pick', 'pick_object' => 'comment', 'pick_val' => '__current__', 'alias' => array('parent'), 'data' => array(), 'hidden' => true));
        } elseif ('taxonomy' == $object) {
            $fields = array('term_id' => array('name' => 'term_id', 'label' => 'ID', 'type' => 'number', 'alias' => array('id', 'ID'), 'options' => array('number_format' => '9999.99')), 'name' => array('name' => 'name', 'label' => 'Title', 'type' => 'text', 'alias' => array('title')), 'slug' => array('name' => 'slug', 'label' => 'Permalink', 'type' => 'slug', 'alias' => array('permalink')), 'description' => array('name' => 'description', 'label' => 'Description', 'type' => 'wysiwyg', 'alias' => array('content')), 'taxonomy' => array('name' => 'taxonomy', 'label' => 'Taxonomy', 'type' => 'pick', 'alias' => array()), 'parent' => array('name' => 'parent', 'label' => 'Parent', 'type' => 'pick', 'pick_object' => 'taxonomy', 'pick_val' => '__current__', 'alias' => array('parent'), 'data' => array(), 'hidden' => true), 'term_taxonomy_id' => array('name' => 'term_taxonomy_id', 'label' => 'Term Taxonomy ID', 'type' => 'number', 'alias' => array(), 'hidden' => true, 'options' => array('number_format' => '9999.99')), 'term_group' => array('name' => 'term_group', 'label' => 'Term Group', 'type' => 'number', 'alias' => array('group'), 'hidden' => true, 'options' => array('number_format' => '9999.99')), 'count' => array('name' => 'count', 'label' => 'Count', 'type' => 'number', 'alias' => array(), 'hidden' => true, 'options' => array('number_format' => '9999.99')));
        }
        $fields = $this->do_hook('get_wp_object_fields', $fields, $object, $pod);
        foreach ($fields as $field => $options) {
            if (!isset($options['alias'])) {
                $options['alias'] = array();
            } else {
                $options['alias'] = (array) $options['alias'];
            }
            if (!isset($options['name'])) {
                $options['name'] = $field;
            }
            $fields[$field] = $options;
        }
        $fields = PodsForm::fields_setup($fields);
        if (did_action('init') && pods_api_cache()) {
            pods_transient_set(trim('pods_api_object_fields_' . $object . $pod_name . '_', '_'), $fields);
        }
        return $fields;
    }

Usage Example

Example #1
0
 /**
  * Recursively join tables based on fields
  *
  * @param array $traverse_recurse Array of traversal options
  *
  * @return array Array of table joins
  *
  * @since 2.0
  */
 function traverse_recurse($traverse_recurse)
 {
     global $wpdb;
     $defaults = array('pod' => null, 'fields' => array(), 'joined' => 't', 'depth' => 0, 'joined_id' => 'id', 'joined_index' => 'id', 'params' => new stdClass(), 'last_table_info' => array());
     $traverse_recurse = array_merge($defaults, $traverse_recurse);
     $joins = array();
     if (0 == $traverse_recurse['depth'] && !empty($traverse_recurse['pod']) && !empty($traverse_recurse['last_table_info']) && isset($traverse_recurse['last_table_info']['id'])) {
         $pod_data = $traverse_recurse['last_table_info'];
     } elseif (empty($traverse_recurse['pod'])) {
         if (!empty($traverse_recurse['params']) && !empty($traverse_recurse['params']->table) && 0 === strpos($traverse_recurse['params']->table, $wpdb->prefix)) {
             if ($wpdb->posts == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'post_type';
             } elseif ($wpdb->terms == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'taxonomy';
             } elseif ($wpdb->users == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'user';
             } elseif ($wpdb->comments == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'comment';
             } else {
                 return $joins;
             }
             $pod_data = array();
             if (in_array($traverse_recurse['pod'], array('user', 'comment'))) {
                 $pod = $this->api->load_pod(array('name' => $traverse_recurse['pod'], 'table_info' => true));
                 if (!empty($pod) && $pod['type'] == $pod) {
                     $pod_data = $pod;
                 }
             }
             if (empty($pod_data)) {
                 $pod_data = array('id' => 0, 'name' => '_table_' . $traverse_recurse['pod'], 'type' => $traverse_recurse['pod'], 'storage' => 'taxonomy' == $traverse_recurse['pod'] ? 'none' : 'meta', 'fields' => array(), 'object_fields' => $this->api->get_wp_object_fields($traverse_recurse['pod']));
                 $pod_data = array_merge($this->api->get_table_info($traverse_recurse['pod'], ''), $pod_data);
             }
             $traverse_recurse['pod'] = $pod_data['name'];
         } else {
             return $joins;
         }
     } else {
         $pod_data = $this->api->load_pod(array('name' => $traverse_recurse['pod'], 'table_info' => true), false);
         if (empty($pod_data)) {
             return $joins;
         }
     }
     if (isset($pod_data['object_fields'])) {
         $pod_data['fields'] = array_merge($pod_data['fields'], $pod_data['object_fields']);
     }
     $tableless_field_types = PodsForm::tableless_field_types();
     $simple_tableless_objects = PodsForm::field_method('pick', 'simple_objects');
     $file_field_types = PodsForm::file_field_types();
     if (!isset($this->traversal[$traverse_recurse['pod']])) {
         $this->traversal[$traverse_recurse['pod']] = array();
     }
     if ((empty($pod_data['meta_table']) || $pod_data['meta_table'] == $pod_data['table']) && (empty($traverse_recurse['fields']) || !isset($traverse_recurse['fields'][$traverse_recurse['depth']]) || empty($traverse_recurse['fields'][$traverse_recurse['depth']]))) {
         return $joins;
     }
     $field = $traverse_recurse['fields'][$traverse_recurse['depth']];
     $ignore_aliases = array('wpml_languages', 'polylang_languages');
     $ignore_aliases = $this->do_hook('traverse_recurse_ignore_aliases', $ignore_aliases, $field, $traverse_recurse);
     if (in_array($field, $ignore_aliases)) {
         return $joins;
     }
     $meta_data_table = false;
     if (!isset($pod_data['fields'][$field]) && 'd' == $field && isset($traverse_recurse['fields'][$traverse_recurse['depth'] - 1])) {
         $field = $traverse_recurse['fields'][$traverse_recurse['depth'] - 1];
         $field_type = 'pick';
         if (isset($traverse_recurse['last_table_info']['pod']['fields'][$field])) {
             $field_type = $traverse_recurse['last_table_info']['pod']['fields'][$field]['type'];
         } elseif (isset($traverse_recurse['last_table_info']['pod']['object_fields'][$field])) {
             $field_type = $traverse_recurse['last_table_info']['pod']['object_fields'][$field]['type'];
         }
         $pod_data['fields'][$field] = array('id' => 0, 'name' => $field, 'type' => $field_type, 'pick_object' => $traverse_recurse['last_table_info']['pod']['type'], 'pick_val' => $traverse_recurse['last_table_info']['pod']['name']);
         $meta_data_table = true;
     }
     // Fallback to meta table if the pod type supports it
     if (!isset($pod_data['fields'][$field])) {
         $last = end($traverse_recurse['fields']);
         if ('post_type' == $pod_data['type'] && !isset($pod_data['object_fields'])) {
             $pod_data['object_fields'] = $this->api->get_wp_object_fields('post_type', $pod_data);
         }
         if ('post_type' == $pod_data['type'] && isset($pod_data['object_fields'][$field]) && in_array($pod_data['object_fields'][$field]['type'], $tableless_field_types)) {
             $pod_data['fields'][$field] = $pod_data['object_fields'][$field];
         } elseif (in_array($pod_data['type'], array('post_type', 'media', 'user', 'comment')) && 'meta_value' == $last) {
             $pod_data['fields'][$field] = PodsForm::field_setup(array('name' => $field));
         } else {
             if ('post_type' == $pod_data['type']) {
                 $pod_data['object_fields'] = $this->api->get_wp_object_fields('post_type', $pod_data, true);
                 if ('post_type' == $pod_data['type'] && isset($pod_data['object_fields'][$field]) && in_array($pod_data['object_fields'][$field]['type'], $tableless_field_types)) {
                     $pod_data['fields'][$field] = $pod_data['object_fields'][$field];
                 } else {
                     return $joins;
                 }
             } else {
                 return $joins;
             }
         }
     }
     $traverse = $pod_data['fields'][$field];
     if ('taxonomy' == $traverse['type']) {
         $traverse['table_info'] = $this->api->get_table_info($traverse['type'], $traverse['name']);
     } elseif (in_array($traverse['type'], $file_field_types)) {
         $traverse['table_info'] = $this->api->get_table_info('post_type', 'attachment');
     } elseif (!in_array($traverse['type'], $tableless_field_types)) {
         $traverse['table_info'] = $this->api->get_table_info($pod_data['type'], $pod_data['name'], $pod_data['name'], $pod_data);
     } elseif (empty($traverse['table_info']) || in_array($traverse['pick_object'], $simple_tableless_objects) && !empty($traverse_recurse['last_table_info'])) {
         if (in_array($traverse['pick_object'], $simple_tableless_objects) && !empty($traverse_recurse['last_table_info'])) {
             $traverse['table_info'] = $traverse_recurse['last_table_info'];
             if (!empty($traverse['table_info']['meta_table'])) {
                 $meta_data_table = true;
             }
         } elseif (!in_array($traverse['type'], $tableless_field_types) && isset($traverse_recurse['last_table_info']) && !empty($traverse_recurse['last_table_info']) && 0 == $traverse_recurse['depth']) {
             $traverse['table_info'] = $traverse_recurse['last_table_info'];
         } else {
             $traverse['table_info'] = $this->api->get_table_info($traverse['pick_object'], $traverse['pick_val'], null, $traverse['pod'], $traverse);
         }
     }
     if (isset($this->traversal[$traverse_recurse['pod']][$traverse['name']])) {
         $traverse = array_merge($traverse, (array) $this->traversal[$traverse_recurse['pod']][$traverse['name']]);
     }
     $traverse = $this->do_hook('traverse', $traverse, compact('pod', 'fields', 'joined', 'depth', 'joined_id', 'params'));
     if (empty($traverse)) {
         return $joins;
     }
     $traverse = pods_sanitize($traverse);
     $traverse['id'] = (int) $traverse['id'];
     if (empty($traverse['id'])) {
         $traverse['id'] = $field;
     }
     $table_info = $traverse['table_info'];
     $this->traversal[$traverse_recurse['pod']][$field] = $traverse;
     $field_joined = $field;
     if (0 < $traverse_recurse['depth'] && 't' != $traverse_recurse['joined']) {
         if ($meta_data_table && ('pick' != $traverse['type'] || !in_array(pods_var('pick_object', $traverse), $simple_tableless_objects))) {
             $field_joined = $traverse_recurse['joined'] . '_d';
         } else {
             $field_joined = $traverse_recurse['joined'] . '_' . $field;
         }
     }
     $rel_alias = 'rel_' . $field_joined;
     if (pods_var('search', $traverse_recurse['params'], false) && empty($traverse_recurse['params']->filters)) {
         if (0 < strlen(pods_var('filter_' . $field_joined, 'get'))) {
             $val = absint(pods_var('filter_' . $field_joined, 'get'));
             $search = "`{$field_joined}`.`{$table_info['field_id']}` = {$val}";
             if ('text' == $this->search_mode) {
                 $val = pods_var('filter_' . $field_joined, 'get');
                 $search = "`{$field_joined}`.`{$traverse['name']}` = '{$val}'";
             } elseif ('text_like' == $this->search_mode) {
                 $val = pods_sanitize(pods_sanitize_like(pods_var_raw('filter_' . $field_joined)));
                 $search = "`{$field_joined}`.`{$traverse['name']}` LIKE '%{$val}%'";
             }
             $this->search_where[] = " {$search} ";
         }
     }
     $the_join = null;
     $joined_id = $table_info['field_id'];
     $joined_index = $table_info['field_index'];
     if ('taxonomy' == $traverse['type']) {
         $rel_tt_alias = 'rel_tt_' . $field_joined;
         if ($meta_data_table) {
             $the_join = "\n                    LEFT JOIN `{$table_info['pod_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['pod_field_id']}` = `{$traverse_recurse['rel_alias']}`.`{$traverse_recurse['joined_id']}`\n                ";
         } else {
             $the_join = "\n                    LEFT JOIN `{$wpdb->term_relationships}` AS `{$rel_alias}` ON\n                        `{$rel_alias}`.`object_id` = `{$traverse_recurse['joined']}`.`ID`\n\n                    LEFT JOIN `{$wpdb->term_taxonomy}` AS `{$rel_tt_alias}` ON\n                        `{$rel_tt_alias}`.`taxonomy` = '{$traverse['name']}'\n                        AND `{$rel_tt_alias}`.`term_taxonomy_id` = `{$rel_alias}`.`term_taxonomy_id`\n\n                    LEFT JOIN `{$table_info['table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['field_id']}` = `{$rel_tt_alias}`.`{$table_info['field_id']}`\n                ";
             // Override $rel_alias
             $rel_alias = $field_joined;
             $joined_id = $table_info['field_id'];
             $joined_index = $table_info['field_index'];
         }
     } elseif (in_array($traverse['type'], $tableless_field_types) && ('pick' != $traverse['type'] || !in_array(pods_var('pick_object', $traverse), $simple_tableless_objects))) {
         if (pods_tableless()) {
             $the_join = "\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$rel_alias}` ON\n                        `{$rel_alias}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$rel_alias}`.`{$table_info['meta_field_id']}` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$field_joined}`.`{$table_info['meta_field_id']}` = CONVERT( `{$rel_alias}`.`{$table_info['meta_field_value']}`, SIGNED )\n                ";
             $joined_id = $table_info['meta_field_id'];
             $joined_index = $table_info['meta_field_index'];
         } elseif ($meta_data_table) {
             $the_join = "\n                    LEFT JOIN `{$table_info['pod_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['pod_field_id']}` = `{$traverse_recurse['rel_alias']}`.`{$traverse_recurse['joined_id']}`\n                ";
         } else {
             $the_join = "\n                    LEFT JOIN `@wp_podsrel` AS `{$rel_alias}` ON\n                        `{$rel_alias}`.`field_id` = {$traverse['id']}\n                        AND `{$rel_alias}`.`item_id` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n\n                    LEFT JOIN `{$table_info['table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['field_id']}` = `{$rel_alias}`.`related_item_id`\n                ";
         }
     } elseif ('meta' == $pod_data['storage']) {
         if ($traverse_recurse['depth'] + 2 == count($traverse_recurse['fields']) && ('pick' != $traverse['type'] || !in_array(pods_var('pick_object', $traverse), $simple_tableless_objects)) && $table_info['meta_field_value'] == $traverse_recurse['fields'][$traverse_recurse['depth'] + 1]) {
             $the_join = "\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$field_joined}`.`{$table_info['meta_field_id']}` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n                ";
             $table_info['recurse'] = false;
         } else {
             $the_join = "\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$field_joined}`.`{$table_info['meta_field_id']}` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n                ";
             $joined_id = $table_info['meta_field_id'];
             $joined_index = $table_info['meta_field_index'];
         }
     }
     $traverse_recursive = array('pod' => pods_var_raw('name', pods_var_raw('pod', $table_info)), 'fields' => $traverse_recurse['fields'], 'joined' => $field_joined, 'depth' => $traverse_recurse['depth'] + 1, 'joined_id' => $joined_id, 'joined_index' => $joined_index, 'params' => $traverse_recurse['params'], 'rel_alias' => $rel_alias, 'last_table_info' => $table_info);
     $the_join = $this->do_hook('traverse_the_join', $the_join, $traverse_recurse, $traverse_recursive);
     if (empty($the_join)) {
         return $joins;
     }
     $joins[$traverse_recurse['pod'] . '_' . $traverse_recurse['depth'] . '_' . $traverse['id']] = $the_join;
     if ($traverse_recurse['depth'] + 1 < count($traverse_recurse['fields']) && !empty($traverse_recurse['pod']) && false !== $table_info['recurse']) {
         $joins = array_merge($joins, $this->traverse_recurse($traverse_recursive));
     }
     return $joins;
 }