include_script(); add_action( "create_term", array( $this, 'create_term' ), 5, 3 ); add_action( "delete_term", array( $this, 'delete_term' ), 5 ); add_action( 'portfolio_cat_add_form_fields', array( $this, 'a3_portfolio_taxonomy_add_new_meta_field' ), 11 ); add_action( 'portfolio_cat_edit_form', array( $this, 'a3_portfolio_taxonomy_edit_meta_field' ), 11, 2 ); add_action( 'edited_portfolio_cat', array( $this, 'a3_portfolio_save_taxonomy_custom_meta' ), 11, 2 ); add_action( 'create_portfolio_cat', array( $this, 'a3_portfolio_save_taxonomy_custom_meta' ), 11, 2 ); add_action( 'delete_portfolio_cat', array( $this, 'a3_portfolio_delete_taxonomy_custom_meta' ), 11, 2 ); // Add columns add_filter( 'manage_edit-portfolio_cat_columns', array( $this, 'portfolio_cat_columns' ) ); add_filter( 'manage_portfolio_cat_custom_column', array( $this, 'portfolio_cat_column' ), 10, 3 ); } /** * Include script and style to show plugin framework for Category page. */ public function include_script( ) { if ( ! in_array( $GLOBALS['pagenow'], array( 'edit-tags.php', 'term.php' ) ) ) return; if ( ! isset( $_REQUEST['taxonomy'] ) || ! in_array( $_REQUEST['taxonomy'], array( 'portfolio_cat' ) ) ) return; add_action( 'admin_footer', function() { $GLOBALS[A3_PORTFOLIO_PREFIX.'admin_interface']->admin_script_load(); } ); add_action( 'admin_footer', function() { $GLOBALS[A3_PORTFOLIO_PREFIX.'admin_interface']->admin_css_load(); } ); add_action( 'admin_footer', array( $this, 'include_style' ) ); add_action( 'admin_footer', array( $this, 'portfolio_term_ordering_validate_script' ), 11 ); } public function include_style( ) { ?> wp_create_nonce( 'portfolio-taxonomy-custom-meta' ), ) ); } public function portfolio_cat_description() { echo wpautop( sprintf( __( 'Create and manage Portfolio Categories here. Category names are used to create the main Portfolio Nav Bar. Turn the Nav Bar feature ON for each category that you want to show on the Portfolio Main Nav Bar. Use drag and drop in categories list to set category position on the Portfolio Nav Bar. Child categories auto show on their Parent Category page Nav Bar. There is an a3 Portfolio Categories widget for navigation.', 'a3-portfolio' ), 'widgets.php' ) ); } public function set_metadata_wpdbfix() { global $wpdb; $wpdb->a3_portfolio_categorymeta = $wpdb->prefix . $this->table_name; $wpdb->tables[] = $this->table_name; } /** * Update category meta */ public function update_a3_portfolio_category_meta( $term_id, $meta_key, $meta_value, $prev_value = '' ) { return update_metadata( 'a3_portfolio_category', $term_id, $meta_key, $meta_value, $prev_value ); } /** * Get category meta */ public function get_a3_portfolio_category_meta( $term_id, $meta_key, $single = true ) { return get_metadata( 'a3_portfolio_category', $term_id, $meta_key, $single ); } /** * Delete category meta */ public function delete_a3_portfolio_category_meta( $term_id, $meta_key, $meta_value = '', $delete_all = false ) { return delete_metadata( 'a3_portfolio_category', $term_id, $meta_key, $meta_value, $delete_all ); } public function create_term( $term_id, $tt_id = '', $taxonomy = '' ) { $this->update_a3_portfolio_category_meta( $term_id, 'order', 0 ); } public function delete_term( $term_id ) { $term_id = (int) $term_id; if ( ! $term_id ) return; global $wpdb; $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->a3_portfolio_categorymeta} WHERE `a3_portfolio_category_id` = %d", $term_id ) ); } // Addnew term page public function a3_portfolio_taxonomy_add_new_meta_field() { $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; // this will add the custom meta field to the add new term page $portfolio_taxonomy_order = wp_create_nonce("portfolio-taxonomy-order"); if ( ( ( ! empty( $_GET['taxonomy'] ) && in_array( $_GET['taxonomy'], array( 'portfolio_cat' ) ) ) ) && ! isset( $_GET['orderby'] ) ) { wp_enqueue_script( 'a3-portfolio-term-admin-script', A3_PORTFOLIO_JS_URL . '/a3.portfolio.term.admin' . $suffix . '.js', array('jquery-ui-sortable'), '1.0.0' ); $taxonomy = isset( $_GET['taxonomy'] ) ? sanitize_text_field( $_GET['taxonomy'] ) : ''; $portfolio_term_order_params = array( 'taxonomy' => $taxonomy, 'security' => $portfolio_taxonomy_order, ); wp_localize_script( 'a3-portfolio-term-admin-script', 'a3_portfolio_term_admin_params', $portfolio_term_order_params ); } ?>
panel_box( $settings_html, array( 'name' => __( 'Portfolio Nav Bar Item', 'a3-portfolio' ), 'id' => 'portfolio_navbar_item', 'is_box' => true, ) ); ?>
term_id, 'active_portfolio_taxonomy', true ); $checked = ''; if ( '' == $active_portfolio_taxonomy || 1 == $active_portfolio_taxonomy ) { $checked = 'checked="checked" '; } ?>
type="checkbox" name="active_portfolio_taxonomy" id="active_portfolio_taxonomy" value="1" />
panel_box( $settings_html, array( 'name' => __( 'Portfolio Nav Bar Item', 'a3-portfolio' ), 'id' => 'portfolio_navbar_item', 'is_box' => true, ) ); ?>
update_a3_portfolio_category_meta($term_id, 'active_portfolio_taxonomy', $meta_value); } } // Save extra taxonomy fields callback function. public function a3_portfolio_update_taxonomy_custom_meta() { check_ajax_referer( 'portfolio-taxonomy-custom-meta', 'security' ); if ( ! current_user_can( 'manage_categories' ) ) { wp_die( -1, 403 ); } $this->update_a3_portfolio_category_meta( absint( $_POST['tax_id'] ), 'active_portfolio_taxonomy', sanitize_text_field( $_POST['pri_navbar'] ) ); } /** * Compare column added to category admin. * * @access public * @param mixed $columns * @return array */ public function portfolio_cat_columns( $columns ) { $have_description_column = false; $new_columns = array(); if ( is_array( $columns ) && count( $columns ) > 0 ) { foreach ( $columns as $column_key => $column_name ) { $new_columns[$column_key] = $column_name; if ( $column_key == 'description' ) { $have_description_column = true; $new_columns['primary_nav_bar'] = __( 'Main Nav Bar', 'a3-portfolio' ); } } if ( ! $have_description_column ) { $new_columns['primary_nav_bar'] = __( 'Main Nav Bar', 'a3-portfolio' ); } else { unset( $new_columns['description'] ); } unset( $new_columns['slug'] ); $columns = $new_columns; } return $columns; } /** * Compare column value added to category admin. * * @access public * @param mixed $columns * @param mixed $column * @param mixed $id * @return array */ public function portfolio_cat_column( $columns, $column, $id ) { $term = get_term_by('ID', $id, 'portfolio_cat'); if ( $column == 'primary_nav_bar' ) { if( $term && $term->parent == 0) { $checked = ''; $active_portfolio_taxonomy = get_metadata( 'a3_portfolio_category', $id, 'active_portfolio_taxonomy', true ); $checked = ''; if ( '' == $active_portfolio_taxonomy || 1 == $active_portfolio_taxonomy ) { $checked = 'checked="checked"'; } ?>
name="active_portfolio_taxonomy[]" id="active_portfolio_taxonomy_" value="1" />
delete_a3_portfolio_category_meta( $term_id, 'active_portfolio_taxonomy'); $this->delete_a3_portfolio_category_meta( $term_id, '_order'); } public function portfolio_update_taxonomy_order(){ check_ajax_referer( 'portfolio-taxonomy-order', 'security' ); if ( ! current_user_can( 'manage_categories' ) ) { wp_die( -1, 403 ); } global $wpdb; $id = absint( $_POST['id'] ); $next_id = isset( $_POST['nextid'] ) && (int) $_POST['nextid'] ? absint( $_POST['nextid'] ) : null; $taxonomy = isset( $_POST['thetaxonomy'] ) ? sanitize_text_field( $_POST['thetaxonomy'] ) : null; $term = get_term_by('id', $id, $taxonomy); if ( ! $id || ! $term || ! $taxonomy ) { die(0); } $this->portfolio_reorder_terms( $term, $next_id, $taxonomy ); $children = get_terms( $taxonomy, "child_of=$id&menu_order=ASC&hide_empty=0" ); if ( $term && sizeof( $children ) ) { echo 'children'; die(); } } public function portfolio_reorder_terms( $the_term, $next_id, $taxonomy, $index = 0, $terms = null ) { if( ! $terms ) $terms = get_terms($taxonomy, 'menu_order=ASC&hide_empty=0&parent=0' ); if( empty( $terms ) ) return $index; $id = $the_term->term_id; $term_in_level = false; // flag: is our term to order in this level of terms foreach ($terms as $term) { if( $term->term_id == $id ) { // our term to order, we skip $term_in_level = true; continue; // our term to order, we skip } // the nextid of our term to order, lets move our term here if(null !== $next_id && $term->term_id == $next_id) { $index++; $index = $this->portfolio_set_term_order($id, $index, $taxonomy, true); } // set order $index++; $index = $this->portfolio_set_term_order($term->term_id, $index, $taxonomy); // if that term has children we walk through them $children = get_terms($taxonomy, "parent={$term->term_id}&menu_order=ASC&hide_empty=0"); if( !empty($children) ) { $index = $this->portfolio_reorder_terms( $the_term, $next_id, $taxonomy, $index, $children ); } } // no nextid meaning our term is in last position if( $term_in_level && null === $next_id ) $index = $this->portfolio_set_term_order($id, $index+1, $taxonomy, true); return $index; } public function portfolio_set_term_order( $term_id, $index, $taxonomy, $recursive = false ) { $term_id = (int) $term_id; $index = (int) $index; $meta_name = 'order'; $this->update_a3_portfolio_category_meta( $term_id, $meta_name, $index ); if( ! $recursive ) return $index; $children = get_terms($taxonomy, "parent=$term_id&menu_order=ASC&hide_empty=0"); foreach ( $children as $term ) { $index ++; $index = $this->portfolio_set_term_order($term->term_id, $index, $taxonomy, true); } clean_term_cache( $term_id, $taxonomy ); return $index; } public function portfolio_terms_clauses( $clauses, $taxonomies, $args ) { global $wpdb; // No sorting when menu_order is false if ( isset( $args['menu_order'] ) && $args['menu_order'] == false ) { return $clauses; } // No sorting when orderby is non default if ( isset( $args['orderby'] ) && $args['orderby'] != 'name' ) { return $clauses; } // No sorting in admin when sorting by a column if ( is_admin() && isset( $_GET['orderby'] ) ) { return $clauses; } // wordpress should give us the taxonomies asked when calling the get_terms function. Only apply to categories and pa_ attributes $found = false; foreach ( (array) $taxonomies as $taxonomy ) { if ( in_array( $taxonomy, array( 'portfolio_cat' ) ) ) { $found = true; break; } } if ( ! $found ) { return $clauses; } // Meta name $meta_name = 'order'; if ( !is_admin() ) { } // query fields if ( strpos( 'COUNT(*)', $clauses['fields'] ) === false ) { $clauses['fields'] .= ', tm.* '; } //query join $clauses['join'] .= " LEFT JOIN {$wpdb->a3_portfolio_categorymeta} AS tm ON (t.term_id = tm.a3_portfolio_category_id AND tm.meta_key = '". $meta_name ."') "; // default to ASC if ( ! isset( $args['menu_order'] ) || ! in_array( strtoupper($args['menu_order']), array('ASC', 'DESC')) ) { $args['menu_order'] = 'ASC'; } $order = "ORDER BY tm.meta_value+0 " . $args['menu_order']; if ( $clauses['orderby'] ): $clauses['orderby'] = str_replace('ORDER BY', $order . ',', $clauses['orderby'] ); else: $clauses['orderby'] = $order; endif; return $clauses; } }