parent_page, __( 'Portfolio Attributes', 'a3-portfolio' ), __( 'Attributes', 'a3-portfolio' ), 'manage_options', $this->attribute_page, array( $this, 'output' ) );
}
public function output() {
$result = '';
$action = '';
// Action to perform: add, edit, delete or none
if ( ! empty( $_POST['add_new_attribute'] ) ) {
$action = 'add';
} elseif ( ! empty( $_POST['save_attribute'] ) && ! empty( $_GET['edit'] ) ) {
$action = 'edit';
} elseif ( ! empty( $_GET['delete'] ) ) {
$action = 'delete';
}
switch ( $action ) {
case 'add' :
$result = $this->process_add_attribute();
break;
case 'edit' :
$result = $this->process_edit_attribute();
break;
case 'delete' :
$result = $this->process_delete_attribute();
break;
}
if ( is_wp_error( $result ) ) {
echo '
' . $result->get_error_message() . '
';
}
// Show admin interface
if ( ! empty( $_GET['edit'] ) ) {
$this->edit_attribute();
} else {
$this->add_attribute();
}
}
/**
* Get and sanitize posted attribute data.
* @return array
*/
private function get_posted_attribute() {
$attribute = array(
'attribute_label' => isset( $_POST['attribute_label'] ) ? sanitize_text_field( stripslashes( $_POST['attribute_label'] ) ) : '',
'attribute_name' => isset( $_POST['attribute_name'] ) ? a3_portfolio_sanitize_taxonomy_name( stripslashes( $_POST['attribute_name'] ) ) : '',
'attribute_type' => isset( $_POST['attribute_type'] ) ? sanitize_text_field( $_POST['attribute_type'] ) : 'select',
'attribute_orderby' => isset( $_POST['attribute_orderby'] ) ? sanitize_text_field( $_POST['attribute_orderby'] ) : '',
);
if ( empty( $attribute['attribute_type'] ) ) {
$attribute['attribute_type'] = 'select';
}
if ( empty( $attribute['attribute_label'] ) ) {
$attribute['attribute_label'] = ucfirst( $attribute['attribute_name'] );
}
if ( empty( $attribute['attribute_name'] ) ) {
$attribute['attribute_name'] = a3_portfolio_sanitize_taxonomy_name( $attribute['attribute_label'] );
}
return $attribute;
}
/**
* See if an attribute name is valid.
* @param string $attribute_name
* @return bool|WP_error result
*/
private function valid_attribute_name( $attribute_name ) {
if ( strlen( $attribute_name ) >= 28 ) {
return new WP_Error( 'error', sprintf( __( 'Slug "%s" is too long (28 characters max). Shorten it, please.', 'a3-portfolio' ), sanitize_title( $attribute_name ) ) );
}
if ( a3_portfolio_check_if_attribute_name_is_reserved( $attribute_name ) ) {
return new WP_Error( 'error', sprintf( __( 'Slug "%s" is not allowed because it is a reserved term. Change it, please.', 'a3-portfolio' ), sanitize_title( $attribute_name ) ) );
}
return true;
}
/**
* Add an attribute.
* @return bool|WP_Error
*/
private function process_add_attribute() {
global $wpdb;
check_admin_referer( 'a3-portfolio-add-new_attribute' );
$attribute = $this->get_posted_attribute();
if ( empty( $attribute['attribute_name'] ) || empty( $attribute['attribute_label'] ) ) {
return new WP_Error( 'error', __( 'Please, provide an attribute name and slug.', 'a3-portfolio' ) );
} elseif ( ( $valid_attribute_name = $this->valid_attribute_name( $attribute['attribute_name'] ) ) && is_wp_error( $valid_attribute_name ) ) {
return $valid_attribute_name;
} elseif ( taxonomy_exists( a3_portfolio_attribute_taxonomy_name( $attribute['attribute_name'] ) ) ) {
return new WP_Error( 'error', sprintf( __( 'Slug "%s" is already in use. Change it, please.', 'a3-portfolio' ), sanitize_title( $attribute['attribute_name'] ) ) );
}
$wpdb->insert( $wpdb->prefix . 'a3_portfolio_attributes', $attribute );
do_action( 'a3_portfolio_attribute_added', $wpdb->insert_id, $attribute );
flush_rewrite_rules();
return true;
}
/**
* Edit an attribute.
* @return bool|WP_Error
*/
private function process_edit_attribute() {
global $wpdb;
$attribute_id = absint( $_GET['edit'] );
check_admin_referer( 'a3-portfolio-save-attribute_' . $attribute_id );
$attribute = $this->get_posted_attribute();
if ( empty( $attribute['attribute_name'] ) || empty( $attribute['attribute_label'] ) ) {
return new WP_Error( 'error', __( 'Please, provide an attribute name and slug.', 'a3-portfolio' ) );
} elseif ( ( $valid_attribute_name = $this->valid_attribute_name( $attribute['attribute_name'] ) ) && is_wp_error( $valid_attribute_name ) ) {
return $valid_attribute_name;
}
$taxonomy_exists = taxonomy_exists( a3_portfolio_attribute_taxonomy_name( $attribute['attribute_name'] ) );
$old_attribute_name = $wpdb->get_var( "SELECT attribute_name FROM {$wpdb->prefix}a3_portfolio_attributes WHERE attribute_id = $attribute_id" );
if ( $old_attribute_name != $attribute['attribute_name'] && a3_portfolio_sanitize_taxonomy_name( $old_attribute_name ) != $attribute['attribute_name'] && $taxonomy_exists ) {
return new WP_Error( 'error', sprintf( __( 'Slug "%s" is already in use. Change it, please.', 'a3-portfolio' ), sanitize_title( $attribute['attribute_name'] ) ) );
}
$wpdb->update( $wpdb->prefix . 'a3_portfolio_attributes', $attribute, array( 'attribute_id' => $attribute_id ) );
do_action( 'a3_portfolio_attribute_updated', $attribute_id, $attribute, $old_attribute_name );
if ( $old_attribute_name != $attribute['attribute_name'] && ! empty( $old_attribute_name ) ) {
// Update taxonomies in the wp term taxonomy table
$wpdb->update(
$wpdb->term_taxonomy,
array( 'taxonomy' => a3_portfolio_attribute_taxonomy_name( $attribute['attribute_name'] ) ),
array( 'taxonomy' => 'a3pa_' . $old_attribute_name )
);
}
echo '' . __( 'Attribute updated successfully', 'a3-portfolio' ) . '
';
flush_rewrite_rules();
return true;
}
/**
* Delete an attribute.
* @return bool
*/
private function process_delete_attribute() {
global $wpdb;
$attribute_id = absint( $_GET['delete'] );
check_admin_referer( 'a3-portfolio-delete-attribute_' . $attribute_id );
$attribute_name = $wpdb->get_var( "SELECT attribute_name FROM {$wpdb->prefix}a3_portfolio_attributes WHERE attribute_id = $attribute_id" );
if ( $attribute_name && $wpdb->query( "DELETE FROM {$wpdb->prefix}a3_portfolio_attributes WHERE attribute_id = $attribute_id" ) ) {
$taxonomy = a3_portfolio_attribute_taxonomy_name( $attribute_name );
if ( taxonomy_exists( $taxonomy ) ) {
$terms = get_terms( $taxonomy, 'orderby=name&hide_empty=0' );
foreach ( $terms as $term ) {
wp_delete_term( $term->term_id, $taxonomy );
}
}
do_action( 'a3_portfolio_attribute_deleted', $attribute_id, $attribute_name, $taxonomy );
return true;
}
return false;
}
/**
* Edit Attribute admin panel.
*
* Shows the interface for changing an attributes type between select and text.
*/
public function edit_attribute() {
global $wpdb;
$edit = absint( $_GET['edit'] );
$attribute_to_edit = $wpdb->get_row( "SELECT * FROM " . $wpdb->prefix . "a3_portfolio_attributes WHERE attribute_id = '$edit'" );
?>
' . __( 'Error: non-existing attribute ID.', 'a3-portfolio' ) . '
';
} else {
$att_type = $attribute_to_edit->attribute_type;
$att_label = $attribute_to_edit->attribute_label;
$att_name = $attribute_to_edit->attribute_name;
$att_orderby = $attribute_to_edit->attribute_orderby;
?>
|
|
|
|
|
|
attribute_label ); ?>
|
attribute_name ); ?> |
attribute_type ) ); ?> |
attribute_orderby ) {
case 'name' :
_e( 'Name', 'a3-portfolio' );
break;
case 'id' :
_e( 'Term ID', 'a3-portfolio' );
break;
default:
_e( 'Custom ordering', 'a3-portfolio' );
break;
}
?> |
attribute_name );
if ( taxonomy_exists( $taxonomy ) ) {
$orderby = $tax->attribute_orderby;
$terms = get_terms( $taxonomy, 'orderby='.$orderby.'&hide_empty=0' );
$terms_string = implode( ', ', wp_list_pluck( $terms, 'name' ) );
if ( $terms_string ) {
echo $terms_string;
} else {
echo '–';
}
} else {
echo '–';
}
?> |
attribute_type ) { ?>
|
|