|
<?php |
|
|
|
/** |
|
* Additions to the Product Add-on Plugins |
|
* |
|
* Enables us to add a product taxonomy to the |
|
* addon so we can further refine where it |
|
* is displayed |
|
* |
|
* |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Add the taxonomy product_brand to the |
|
* list of possible ones to look for |
|
* when displaying the addon on the front end |
|
* |
|
* |
|
*/ |
|
|
|
|
|
add_filter( 'get_product_addons_product_terms', function( $terms, $post_id ) { |
|
|
|
|
|
//Add Designer terms |
|
$designers = wp_get_post_terms( $post_id, 'product_brand', array( 'fields' => 'ids' ) ); |
|
|
|
$terms = array_merge( $terms, $designers ); |
|
|
|
|
|
|
|
return $terms; |
|
|
|
}, 10, 2 ); |
|
|
|
|
|
|
|
/** |
|
* Modify the query args for getting the |
|
* addons posts |
|
* |
|
* We need to change the tax_query to include |
|
* the additional taxonomy (product_brand) |
|
* |
|
*/ |
|
|
|
add_filter( 'get_product_addons_global_query_args', function( $args, $product_terms ) { |
|
|
|
|
|
/*$current_product_id = wc_get_product()->get_id(); |
|
|
|
if ( ! $current_product_id ) { |
|
return $args; |
|
}*/ |
|
|
|
$cat_terms = []; |
|
$extra_taxes = []; |
|
|
|
foreach( $product_terms as $term_id ) { |
|
|
|
$term = get_term( $term_id ); |
|
|
|
if ( ! is_wp_error( $term ) && ! empty( $term ) && $term->taxonomy !== 'product_cat' ) { |
|
|
|
$extra_taxes[ $term->taxonomy ]['taxonomy'] = $term->taxonomy; |
|
$extra_taxes[ $term->taxonomy ]['terms'][] = $term_id; |
|
|
|
} else { |
|
|
|
$cat_terms[] = $term_id; |
|
} |
|
|
|
} |
|
|
|
|
|
//We are organizing the terms into proper tax groups |
|
|
|
if ( !empty( $cat_terms ) ) { |
|
|
|
$args['tax_query'][0]['terms'] = $cat_terms; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( !empty( $extra_taxes ) ) { |
|
|
|
//Make our relationship AND because we need to be very specific now that we're using 2 taxonomies |
|
$args['tax_query']['relation'] = 'AND'; |
|
|
|
foreach ( $extra_taxes as $extra_tax ) { |
|
|
|
$args['tax_query'][] = [ |
|
'taxonomy' => $extra_tax['taxonomy'], |
|
'field' => 'id', |
|
'terms' => $extra_tax['terms'], |
|
'include_children' => false |
|
]; |
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
return $args; |
|
|
|
}, 10, 2 ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Add pick field for Designers to refine Addon location |
|
* |
|
* This is sort of a hack because you need to use the action |
|
* and close the table row, then create another one. |
|
*/ |
|
|
|
add_action( 'woocommerce_product_addons_global_edit_objects', function( $objects ) { |
|
|
|
//Make sure we're on the edit page |
|
if( empty( $_GET['edit'] ) ) { |
|
|
|
return; |
|
|
|
} |
|
|
|
$designer_objects = (array) wp_get_post_terms( (int) $_GET['edit'], array( 'product_brand' ), array( 'fields' => 'ids' ) ); |
|
|
|
|
|
?> |
|
</select> |
|
<p class="description"><?php esc_html_e( 'Select which categories this add-on should apply to. Create add-ons for a single product when editing that product.', 'woocommerce-product-addons' ); ?></p> |
|
</td> |
|
</tr> |
|
<tr class="custom-taxonomy-product-brand"> |
|
<th> |
|
<label for="addon-objects-product-brand"><?php esc_html_e( 'Designers', 'woocommerce-product-addons' ); ?></label> |
|
</th> |
|
<td> |
|
<select id="addon-objects-product-brand" name="addon-objects-product-brand[]" multiple="multiple" style="width:50%;" data-placeholder="<?php esc_attr_e( 'Choose designers…', 'woocommerce-product-addons' ); ?>" class="wc-enhanced-select-designers wc-pao-enhanced-select"> |
|
<option value="all_designers" <?php selected( empty( $designer_objects ), true ); ?>><?php esc_html_e( 'All Designers', 'woocommerce-product-addons' ); ?></option> |
|
<optgroup label="<?php esc_attr_e( 'Designers', 'woocommerce-product-addons' ); ?>"> |
|
<?php |
|
$terms = get_terms( 'product_brand', array( 'hide_empty' => 0 ) ); |
|
|
|
foreach ( $terms as $term ) { |
|
echo '<option value="' . $term->term_id . '" ' . selected( in_array( $term->term_id, $designer_objects ), true, false ) . '>' . $term->name . '</option>'; |
|
} |
|
?> |
|
</optgroup> |
|
<?php |
|
|
|
|
|
}, 10, 1 ); |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Queue the script for the custom taxonomy selector |
|
* |
|
*/ |
|
|
|
add_action( 'admin_enqueue_scripts', 'admin_settings_mdj_addons_enqueue_scripts'); |
|
|
|
function admin_settings_mdj_addons_enqueue_scripts() { |
|
|
|
if ( |
|
'product_page_addons' !== get_current_screen()->id && |
|
'product' !== get_current_screen()->id && |
|
'shop_order' !== get_current_screen()->id && |
|
'shop_subscription' !== get_current_screen()->id |
|
) { |
|
return; |
|
} |
|
|
|
|
|
wp_enqueue_script( 'wc-addons-custom-tax', get_stylesheet_directory_uri() . '/assets/js/wc-addons.js', array( 'jquery' ), null, true ); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Process saving the Designer |
|
* |
|
*/ |
|
|
|
add_action( 'woocommerce_product_addons_global_edit_addons', function( $edit_post, $objects) { |
|
|
|
|
|
//Save our custom taxonomy selector |
|
$designer_objects = ! empty( $_POST['addon-objects-product-brand'] ) ? array_map( 'absint', $_POST['addon-objects-product-brand'] ) : array(); |
|
|
|
|
|
$result = wp_set_post_terms( $edit_post['ID'], $designer_objects, 'product_brand', false ); |
|
|
|
|
|
}, 10, 2); |
|
|
|
|
|
|
|
/** |
|
* Load the Designers on the Addon |
|
* |
|
* |
|
*/ |
|
|
|
add_filter( 'woocommerce_product_addons_global_post_terms', function( $args ) { |
|
|
|
$args[] = 'product_brand'; |
|
|
|
return $args; |
|
|
|
}, 10 , 1); |
|
|
|
|
|
|
|
|