public function post_type_field_sets($post_type_name, $template_name = "", $orderby = "position ASC") { global $wf; if (is_null($template_name)) { $template_name = ""; } $args = array($post_type_name, $template_name, $orderby); if (is_null($ret = $this->property_cache_args("post_type_field_sets", $args ))) { $this->field_types = array(); global $wpdb; $field_sets_table = MPM::table("field-sets"); $fields_table = MPM::table("fields"); $select_list = $this->assigned_select_list(); $sql = " SELECT $select_list FROM $field_sets_table s INNER JOIN $fields_table f ON s.id = f.`field_set_id` WHERE (s.type = 'p' OR s.type = 's') AND ".MPM::visibility_rlike("post_types", $post_type_name, "s.")." AND ".MPM::visibility_rlike("post_types", $post_type_name, "f."); if ($template_name != "") { // filter by template too $sql .= " AND ".MPM::visibility_rlike("templates", $template_name, "s.")." AND ".MPM::visibility_rlike("templates", $template_name, "f."); } $sql .= " AND f.disabled = 0 AND s.disabled = 0 ORDER BY set_type, set_position, field_position; "; $field_sets = array(); $fields_by_set = array(); $results = $wpdb->get_results($sql); if ($template_name != "") { $template_results = $this->template_field_sets($template_name); if ($template_results && count($template_results)) { $results = array_merge($results, $template_results); } } foreach ($results as $result) { $set_name = $result->set_name; $set_type = $result->set_type; $use_set = true; $use_field = true; if (isset($field_sets[$set_name])) { if ($set_type == $field_sets[$set_name]["type"]) { $use_set = false; // we already have this set recorded } if ($set_type == 't' && in_array($field_sets[$set_name]["type"], array('s','p'))) { // clear any existing fields already set $fields_by_set[$set_name] = null; } if ($set_type == 's' && $field_sets[$set_name]["type"] == 'p') { // the existing set is a post type field set, which holds greater specificity than this shared set, so don't use this set or field $use_set = false; $use_field = false; } if (in_array($set_type, array('p','s')) && $field_sets[$set_name]["type"] == 't') { // the existing set is a template field set, which holds greater specificity than this shared or post type set, so don't use this set's info $use_set = false; $use_field = false; } } if ($use_set) { $field_sets[$set_name] = $this->set_data_from_result($result); } // now record the field too if ($use_field) { if (!in_array($result->field_type, $this->field_types)) { $this->field_types[] = $result->field_type; } $fields_by_set[$set_name][$result->field_name] = $this->field_data_from_result($result); } } // endforeach $field_set_models = array(); foreach ($field_sets as $field_set) { if ($field_set["type"] == "s") { $field_set_model = new MPM_SharedFieldSet(); } else { $field_set_model = new MPM_FieldSet(); } $field_set_model->set_from_row($field_set); $field_models = array(); $fields = $fields_by_set[$field_set["name"]]; if (is_array($fields) && count($fields)) { foreach ($fields as $field) { $field_model = new MPM_Field(); $field_model->set_from_row($field); if ($field_model->in_current_site()) { $field_models[$field["name"]] = $field_model; } } $field_set_model->set_fields($field_models); } if ($field_set_model->in_current_site()) { $field_set_models[$field_set_model->name] = $field_set_model; } } $ret = $this->property_cache_args("post_type_field_sets", $args, $field_set_models ); } return $ret; }