Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
wp-content
/
plugins
/
advanced-custom-fields
/
core
/
fields
:
post_object.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php class acf_field_post_object extends acf_field { /* * __construct * * Set name / label needed for actions / filters * * @since 3.6 * @date 23/01/13 */ function __construct() { // vars $this->name = 'post_object'; $this->label = __("Post Object",'acf'); $this->category = __("Relational",'acf'); $this->defaults = array( 'post_type' => array('all'), 'taxonomy' => array('all'), 'multiple' => 0, 'allow_null' => 0, ); // do not delete! parent::__construct(); } /* * load_field() * * This filter is appied to the $field after it is loaded from the database * * @type filter * @since 3.6 * @date 23/01/13 * * @param $field - the field array holding all the field options * * @return $field - the field array holding all the field options */ function load_field( $field ) { // validate post_type if( !$field['post_type'] || !is_array($field['post_type']) || in_array('', $field['post_type']) ) { $field['post_type'] = array( 'all' ); } // validate taxonomy if( !$field['taxonomy'] || !is_array($field['taxonomy']) || in_array('', $field['taxonomy']) ) { $field['taxonomy'] = array( 'all' ); } // return return $field; } /* * create_field() * * Create the HTML interface for your field * * @param $field - an array holding all the field's data * * @type action * @since 3.6 * @date 23/01/13 */ function create_field( $field ) { // global global $post; // vars $args = array( 'numberposts' => -1, 'post_type' => null, 'orderby' => 'title', 'order' => 'ASC', 'post_status' => array('publish', 'private', 'draft', 'inherit', 'future'), 'suppress_filters' => false, ); // load all post types by default if( in_array('all', $field['post_type']) ) { $field['post_type'] = apply_filters('acf/get_post_types', array()); } // create tax queries if( ! in_array('all', $field['taxonomy']) ) { // vars $taxonomies = array(); $args['tax_query'] = array(); foreach( $field['taxonomy'] as $v ) { // find term (find taxonomy!) // $term = array( 0 => $taxonomy, 1 => $term_id ) $term = explode(':', $v); // validate if( !is_array($term) || !isset($term[1]) ) { continue; } // add to tax array $taxonomies[ $term[0] ][] = $term[1]; } // now create the tax queries foreach( $taxonomies as $k => $v ) { $args['tax_query'][] = array( 'taxonomy' => $k, 'field' => 'id', 'terms' => $v, ); } } // Change Field into a select $field['type'] = 'select'; $field['choices'] = array(); foreach( $field['post_type'] as $post_type ) { // set post_type $args['post_type'] = $post_type; // set order $get_pages = false; if( is_post_type_hierarchical($post_type) && !isset($args['tax_query']) ) { $args['sort_column'] = 'menu_order, post_title'; $args['sort_order'] = 'ASC'; $get_pages = true; } // filters $args = apply_filters('acf/fields/post_object/query', $args, $field, $post); $args = apply_filters('acf/fields/post_object/query/name=' . $field['_name'], $args, $field, $post ); $args = apply_filters('acf/fields/post_object/query/key=' . $field['key'], $args, $field, $post ); if( $get_pages ) { $posts = get_pages( $args ); } else { $posts = get_posts( $args ); } if($posts) { foreach( $posts as $p ) { // find title. Could use get_the_title, but that uses get_post(), so I think this uses less Memory $title = ''; $ancestors = get_ancestors( $p->ID, $p->post_type ); if($ancestors) { foreach($ancestors as $a) { $title .= '–'; } } $title .= ' ' . apply_filters( 'the_title', $p->post_title, $p->ID ); // status if( $p->post_status != "publish" ) { $title .= " ($p->post_status)"; } // WPML if( defined('ICL_LANGUAGE_CODE') ) { $title .= ' (' . ICL_LANGUAGE_CODE . ')'; } // filters $title = apply_filters('acf/fields/post_object/result', $title, $p, $field, $post); $title = apply_filters('acf/fields/post_object/result/name=' . $field['_name'] , $title, $p, $field, $post); $title = apply_filters('acf/fields/post_object/result/key=' . $field['key'], $title, $p, $field, $post); // add to choices if( count($field['post_type']) == 1 ) { $field['choices'][ $p->ID ] = $title; } else { // group by post type $post_type_object = get_post_type_object( $p->post_type ); $post_type_name = $post_type_object->labels->name; $field['choices'][ $post_type_name ][ $p->ID ] = $title; } } // foreach( $posts as $post ) } // if($posts) } // foreach( $field['post_type'] as $post_type ) // create field do_action('acf/create_field', $field ); } /* * create_options() * * Create extra options for your field. This is rendered when editing a field. * The value of $field['name'] can be used (like bellow) to save extra data to the $field * * @type action * @since 3.6 * @date 23/01/13 * * @param $field - an array holding all the field's data */ function create_options( $field ) { // vars $key = $field['name']; ?> <tr class="field_option field_option_<?php echo $this->name; ?>"> <td class="label"> <label for=""><?php _e("Post Type",'acf'); ?></label> </td> <td> <?php $choices = array( 'all' => __("All",'acf') ); $choices = apply_filters('acf/get_post_types', $choices); do_action('acf/create_field', array( 'type' => 'select', 'name' => 'fields['.$key.'][post_type]', 'value' => $field['post_type'], 'choices' => $choices, 'multiple' => 1, )); ?> </td> </tr> <tr class="field_option field_option_<?php echo $this->name; ?>"> <td class="label"> <label><?php _e("Filter from Taxonomy",'acf'); ?></label> </td> <td> <?php $choices = array( '' => array( 'all' => __("All",'acf') ) ); $simple_value = false; $choices = apply_filters('acf/get_taxonomies_for_select', $choices, $simple_value); do_action('acf/create_field', array( 'type' => 'select', 'name' => 'fields['.$key.'][taxonomy]', 'value' => $field['taxonomy'], 'choices' => $choices, 'multiple' => 1, )); ?> </td> </tr> <tr class="field_option field_option_<?php echo $this->name; ?>"> <td class="label"> <label><?php _e("Allow Null?",'acf'); ?></label> </td> <td> <?php do_action('acf/create_field', array( 'type' => 'radio', 'name' => 'fields['.$key.'][allow_null]', 'value' => $field['allow_null'], 'choices' => array( 1 => __("Yes",'acf'), 0 => __("No",'acf'), ), 'layout' => 'horizontal', )); ?> </td> </tr> <tr class="field_option field_option_<?php echo $this->name; ?>"> <td class="label"> <label><?php _e("Select multiple values?",'acf'); ?></label> </td> <td> <?php do_action('acf/create_field', array( 'type' => 'radio', 'name' => 'fields['.$key.'][multiple]', 'value' => $field['multiple'], 'choices' => array( 1 => __("Yes",'acf'), 0 => __("No",'acf'), ), 'layout' => 'horizontal', )); ?> </td> </tr> <?php } /* * format_value() * * This filter is appied to the $value after it is loaded from the db and before it is passed to the create_field action * * @type filter * @since 3.6 * @date 23/01/13 * * @param $value - the value which was loaded from the database * @param $post_id - the $post_id from which the value was loaded * @param $field - the field array holding all the field options * * @return $value - the modified value */ function format_value( $value, $post_id, $field ) { // empty? if( !empty($value) ) { // convert to integers if( is_array($value) ) { $value = array_map('intval', $value); } else { $value = intval($value); } } // return value return $value; } /* * format_value_for_api() * * This filter is appied to the $value after it is loaded from the db and before it is passed back to the api functions such as the_field * * @type filter * @since 3.6 * @date 23/01/13 * * @param $value - the value which was loaded from the database * @param $post_id - the $post_id from which the value was loaded * @param $field - the field array holding all the field options * * @return $value - the modified value */ function format_value_for_api( $value, $post_id, $field ) { // no value? if( !$value ) { return false; } // null? if( $value == 'null' ) { return false; } // multiple / single if( is_array($value) ) { // find posts (DISTINCT POSTS) $posts = get_posts(array( 'numberposts' => -1, 'post__in' => $value, 'post_type' => apply_filters('acf/get_post_types', array()), 'post_status' => array('publish', 'private', 'draft', 'inherit', 'future'), )); $ordered_posts = array(); foreach( $posts as $post ) { // create array to hold value data $ordered_posts[ $post->ID ] = $post; } // override value array with attachments foreach( $value as $k => $v) { // check that post exists (my have been trashed) if( !isset($ordered_posts[ $v ]) ) { unset( $value[ $k ] ); } else { $value[ $k ] = $ordered_posts[ $v ]; } } } else { $value = get_post($value); } // return the value return $value; } /* * update_value() * * This filter is appied to the $value before it is updated in the db * * @type filter * @since 3.6 * @date 23/01/13 * * @param $value - the value which will be saved in the database * @param $post_id - the $post_id of which the value will be saved * @param $field - the field array holding all the field options * * @return $value - the modified value */ function update_value( $value, $post_id, $field ) { // validate if( empty($value) ) { return $value; } if( is_object($value) && isset($value->ID) ) { // object $value = $value->ID; } elseif( is_array($value) ) { // array foreach( $value as $k => $v ){ // object? if( is_object($v) && isset($v->ID) ) { $value[ $k ] = $v->ID; } } // save value as strings, so we can clearly search for them in SQL LIKE statements $value = array_map('strval', $value); } return $value; } } new acf_field_post_object(); ?>