_x( 'Custom Fields', 'Post Type General Name', 'advanced-classifieds-and-directory-pro' ), 'singular_name' => _x( 'Custom Field', 'Post Type Singular Name', 'advanced-classifieds-and-directory-pro' ), 'menu_name' => __( 'Custom Fields', 'advanced-classifieds-and-directory-pro' ), 'name_admin_bar' => __( 'Custom Field', 'advanced-classifieds-and-directory-pro' ), 'all_items' => __( 'Custom Fields', 'advanced-classifieds-and-directory-pro' ), 'add_new_item' => __( 'Add New Field', 'advanced-classifieds-and-directory-pro' ), 'add_new' => __( 'Add New', 'advanced-classifieds-and-directory-pro' ), 'new_item' => __( 'New Field', 'advanced-classifieds-and-directory-pro' ), 'edit_item' => __( 'Edit Field', 'advanced-classifieds-and-directory-pro' ), 'update_item' => __( 'Update Field', 'advanced-classifieds-and-directory-pro' ), 'view_item' => __( 'View Field', 'advanced-classifieds-and-directory-pro' ), 'search_items' => __( 'Search Field', 'advanced-classifieds-and-directory-pro' ), 'not_found' => __( 'No fields found', 'advanced-classifieds-and-directory-pro' ), 'not_found_in_trash' => __( 'No fields found in Trash', 'advanced-classifieds-and-directory-pro' ), ); $args = array( 'label' => __( 'Custom Fields', 'advanced-classifieds-and-directory-pro' ), 'description' => __( 'Custom listing form fields.', 'advanced-classifieds-and-directory-pro' ), 'labels' => $labels, 'supports' => array( 'title' ), 'taxonomies' => array( 'acadp_categories' ), 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => false, 'show_in_admin_bar' => true, 'show_in_nav_menus' => false, 'can_export' => true, 'has_archive' => false, 'rewrite' => false, 'exclude_from_search' => true, 'publicly_queryable' => false, 'capability_type' => 'acadp_field', 'map_meta_cap' => true, ); register_post_type( 'acadp_fields', $args ); } /** * Add "Custom Fields" menu. * * @since 1.7.3 */ public function admin_menu() { add_submenu_page( 'advanced-classifieds-and-directory-pro', __( 'Advanced Classifieds and Directory Pro - Custom Fields', 'advanced-classifieds-and-directory-pro' ), __( 'Custom Fields', 'advanced-classifieds-and-directory-pro' ), 'manage_acadp_options', 'edit.php?post_type=acadp_fields' ); } /** * Move "Custom Fields" submenu under our plugin's main menu. * * @since 1.7.3 * @param string $parent_file The parent file. * @return string $parent_file The parent file. */ public function parent_file( $parent_file ) { global $submenu_file, $current_screen; if ( 'acadp_fields' == $current_screen->post_type ) { $submenu_file = 'edit.php?post_type=acadp_fields'; $parent_file = 'advanced-classifieds-and-directory-pro'; } return $parent_file; } /** * Register meta boxes. * * @since 1.0.0 */ public function add_meta_boxes() { remove_meta_box( 'slugdiv', 'acadp_fields', 'normal' ); add_meta_box( 'acadp-field-details', __( 'Field details', 'advanced-classifieds-and-directory-pro' ), array( $this, 'display_meta_box_field_details' ), 'acadp_fields', 'normal', 'high' ); add_meta_box( 'acadp-field-options', __( 'Display options', 'advanced-classifieds-and-directory-pro' ), array( $this, 'display_meta_box_field_options' ), 'acadp_fields', 'normal', 'low' ); } /** * Display the field details meta box. * * @since 1.0.0 * @param WP_Post $post WordPress Post object */ public function display_meta_box_field_details( $post ) { $post_meta = get_post_meta( $post->ID ); // Add a nonce field so we can check for it later wp_nonce_field( 'acadp_save_field_details', 'acadp_field_details_nonce' ); require_once ACADP_PLUGIN_DIR . 'admin/templates/fields/field-details.php'; } /** * Display the field options meta box. * * @since 1.0.0 * @param WP_Post $post WordPress Post object */ public function display_meta_box_field_options( $post ) { $post_meta = get_post_meta( $post->ID ); // Add a nonce field so we can check for it later wp_nonce_field( 'acadp_save_field_options', 'acadp_field_options_nonce' ); require_once ACADP_PLUGIN_DIR . 'admin/templates/fields/field-options.php'; } /** * Save meta data. * * @since 1.0.0 * @param int $post_id Post ID. * @param WP_Post $post The post object. * @return int $post_id If the save was successful or not. */ public function save_meta_data( $post_id, $post ) { if ( ! isset( $_POST['post_type'] ) ) { return $post_id; } // Check this is the "acadp_fields" custom post type if ( 'acadp_fields' != $post->post_type ) { return $post_id; } // If this is an autosave, our form has not been submitted, so we don't want to do anything if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) { return $post_id; } // Check the logged in user has permission to edit this post if ( ! acadp_current_user_can( 'edit_acadp_fields' ) ) { return $post_id; } // Check if "acadp_field_details_nonce" nonce is set if ( isset( $_POST['acadp_field_details_nonce'] ) ) { // Verify that the nonce is valid if( wp_verify_nonce( $_POST['acadp_field_details_nonce'], 'acadp_save_field_details' ) ) { // OK to save meta data $field_type = sanitize_key( $_POST['type'] ); update_post_meta( $post_id, 'type', $field_type ); $field_instructions = sanitize_textarea_field( $_POST['instructions'] ); update_post_meta( $post_id, 'instructions', $field_instructions ); $field_required = (int) $_POST['required']; update_post_meta( $post_id, 'required', $field_required ); $field_choices = sanitize_textarea_field( $_POST['choices'] ); update_post_meta( $post_id, 'choices', $field_choices ); if ( 'checkbox' == $field_type || 'textarea' == $field_type ) { $field_default_value = sanitize_textarea_field( $_POST['default_value_' . $field_type] ); } elseif ( 'number' == $field_type || 'range' == $field_type ) { $field_default_value = ( '' == $_POST['default_value'] ) ? '' : (int) $_POST['default_value']; } elseif ( 'date' == $field_type || 'datetime' == $field_type ) { $field_default_value = isset( $_POST['default_value_datetime'] ) ? 1 : 0; } elseif ( 'url' == $field_type ) { $field_default_value = esc_url_raw( $_POST['default_value'] ); } else { $field_default_value = sanitize_text_field( $_POST['default_value' ] ); } update_post_meta( $post_id, 'default_value', $field_default_value ); $field_min = ( '' == $_POST['min'] ) ? '' : (int) $_POST['min']; update_post_meta( $post_id, 'min', $field_min ); $field_max = ( '' == $_POST['max'] ) ? '' : (int) $_POST['max']; update_post_meta( $post_id, 'max', $field_max ); $field_step = ( '' == $_POST['step'] ) ? '' : (int) $_POST['step']; update_post_meta( $post_id, 'step', $field_step ); $field_allow_null = (int) $_POST['allow_null']; update_post_meta( $post_id, 'allow_null', $field_allow_null ); $field_placeholder = sanitize_text_field( $_POST['placeholder'] ); update_post_meta( $post_id, 'placeholder', $field_placeholder ); $field_rows = (int) $_POST['rows']; update_post_meta( $post_id, 'rows', $field_rows ); $field_target = sanitize_text_field( $_POST['target'] ); update_post_meta( $post_id, 'target', $field_target ); $field_nofollow = (int) $_POST['nofollow']; update_post_meta( $post_id, 'nofollow', $field_nofollow ); } } // Check if "acadp_field_options_nonce" nonce is set if ( isset( $_POST['acadp_field_options_nonce'] ) ) { // Verify that the nonce is valid if ( wp_verify_nonce( $_POST['acadp_field_options_nonce'], 'acadp_save_field_options' ) ) { // OK to save meta data $field_associate = sanitize_text_field( $_POST['associate'] ); update_post_meta( $post_id, 'associate', $field_associate ); $field_searchable = (int) $_POST['searchable']; update_post_meta( $post_id, 'searchable', $field_searchable ); $field_type_search = ( isset( $_POST['type'] ) && ( 'date' == $_POST['type'] || 'datetime' == $_POST['type'] ) ) ? sanitize_text_field( $_POST['type_search'] ) : ''; update_post_meta( $post_id, 'type_search', $field_type_search ); $field_listings_archive = (int) $_POST['listings_archive']; update_post_meta( $post_id, 'listings_archive', $field_listings_archive ); $field_order = floatval( $_POST['order'] ); update_post_meta( $post_id, 'order', $field_order ); } } return $post_id; } /** * Add custom filter options. * * @since 1.0.0 */ public function restrict_manage_posts() { global $typenow, $wp_query; if ( 'acadp_fields' == $typenow ) { // Restrict by category wp_dropdown_categories(array( 'show_option_none' => __( 'All Categories', 'advanced-classifieds-and-directory-pro' ), 'option_none_value' => 0, 'taxonomy' => 'acadp_categories', 'name' => 'acadp_categories', 'orderby' => 'name', 'selected' => isset( $wp_query->query['acadp_categories'] ) ? (int) $wp_query->query['acadp_categories'] : '', 'hierarchical' => true, 'depth' => 3, 'show_count' => false, 'hide_empty' => false, )); // Restrict by field associate $associate = isset( $_GET['associate'] ) ? sanitize_text_field( $_GET['associate'] ) : ''; echo ''; } } /** * Filter fields(posts) by categories(taxonomy). * * @since 1.0.0 * @param WP_Query $query WordPress Query object. */ public function parse_query( $query ) { global $pagenow, $post_type; if ( 'edit.php' == $pagenow && 'acadp_fields' == $post_type ) { // Convert category id to taxonomy term in query if ( isset( $query->query_vars['acadp_categories'] ) && ctype_digit( $query->query_vars['acadp_categories'] ) && $query->query_vars['acadp_categories'] != 0 ) { $term = get_term_by( 'id', $query->query_vars['acadp_categories'], 'acadp_categories' ); $query->query_vars['acadp_categories'] = $term->slug; } // Associate if ( isset( $_GET['associate'] ) && ! empty( $_GET['associate'] ) ) { $query->query_vars['meta_key'] = 'associate'; $query->query_vars['meta_value'] = sanitize_text_field( $_GET['associate'] ); } } } /** * Exclude child categories(taxonomy) from the result. * * @since 1.0.0 * @param WP_Query $query WordPress Query object. */ public function parse_tax_query( $query ) { global $pagenow, $post_type; if ( 'edit.php' == $pagenow && 'acadp_fields' == $post_type ) { if ( ! empty( $query->tax_query->queries ) ) { $query->tax_query->queries[0]['include_children'] = 0; } } } /** * Sort fieLds by custom order(meta) value. * * @since 1.0.0 * @param WP_Query $query WordPress Query object. */ public function custom_order( $query ) { // The current post type $post_type = $query->get('post_type'); // Check post type if ( 'acadp_fields' == $post_type ) { // Post Column: field_order if ( '' == $query->get('orderby') && '' == $query->get('order') ) { $query->set('orderby', array( 'order' => 'ASC', 'date' => 'DESC' )); } } } /** * Retrieve the table columns. * * @since 1.0.0 * @param array $columns Array of default table columns. * @return array $columns Updated list of table columns. */ public function get_columns( $columns ) { $new_columns = array( 'associate' => __( 'Assigned to', 'advanced-classifieds-and-directory-pro' ), 'taxonomy-acadp_categories' => __( 'Categories', 'advanced-classifieds-and-directory-pro' ), 'type' => __( 'Type', 'advanced-classifieds-and-directory-pro' ), 'required' => __( 'Required?', 'advanced-classifieds-and-directory-pro' ), 'searchable' => __( 'Searchable?', 'advanced-classifieds-and-directory-pro' ), 'listings_archive' => __( 'Listings Archive?', 'advanced-classifieds-and-directory-pro' ), 'order' => __( 'Order', 'advanced-classifieds-and-directory-pro' ), 'id' => __( 'ID', 'advanced-classifieds-and-directory-pro' ) ); $columns = acadp_array_insert_after( 'title', $columns, $new_columns ); unset( $columns['date'] ); return $columns; } /** * This function renders the custom columns in the list table. * * @since 1.0.0 * @param string $column The name of the column. * @param string $post_id Post ID. */ public function custom_column_content( $column, $post_id ) { switch ( $column ) { case 'associate': $value = get_post_meta( $post_id, 'associate', true ); echo ( 'form' == $value ) ? __( 'Form', 'advanced-classifieds-and-directory-pro' ) : __( 'Categories', 'advanced-classifieds-and-directory-pro' ); break; case 'type': $types = acadp_get_custom_field_types(); $value = get_post_meta( $post_id, 'type', true ); echo ! empty( $value ) ? $types[ $value ] : ''; break; case 'required': $value = get_post_meta( $post_id, 'required', true ); echo '    ' . ( $value == 1 ? '✓' : '✗' ); break; case 'searchable': $value = get_post_meta( $post_id, 'searchable', true ); echo '    ' . ( $value == 1 ? '✓' : '✗' ); break; case 'listings_archive': $value = get_post_meta( $post_id, 'listings_archive', true ); echo '    ' . ( $value == 1 ? '✓' : '✗' ); break; case 'order': $value = get_post_meta( $post_id, 'order', true ); echo $value; break; case 'id': echo esc_html( $post_id ); break; } } /** * Remove quick edit. * * @since 1.0.0 * @param array $actions An array of row action links. * @param WP_Post $post The post object. * @return array $actions Updated array of row action links. */ public function remove_row_actions( $actions, $post ) { global $current_screen; if ( ! isset( $current_screen ) ) { return $actions; } if ( 'acadp_fields' != $current_screen->post_type ) { return $actions; } unset( $actions['view'] ); unset( $actions['inline hide-if-no-js'] ); return $actions; } }