Téma Woodmart ponúka svojím používateľom množstvo užitočných funkcií, vrátane vlastných produktových štítkov (custom product labels). Tie sú v téme vyriešené pomerne jednoducho pomocou vlastností produktov, ktorým je možné nastaviť, či a v akej forme sa majú zobraziť medzi štítkami produktov. Viac o používaní produktových štítkov v téme Woodmart sa dočítate v dokumentácií na tomto odkaze.
Postup je teda jednoduchý, stačí si v administrácií vlastností produktov vytvoriť novú vlastnosť, napr. Štítok a v časti Extra povoliť možnosť “Show attribute label on products”.
Medzi hodnoty vlastnosti Štítok si môžeme pridať napr. Black Friday, Vyrobené na Slovensku, Použité a pod. Ďalej je potrebné už len priradiť túto vlastnosť produktom, ktorých sa týka. To je možné spraviť jednoducho cez editáciu produktu v časti Vlastnosti. Priradená vlastnosť sa tak zobrazí aj medzi štítkami produktu v zozname produktov ako aj v detaile produktu.
V prípade veľkého množstva produktov je možné použiť niektorý z pluginov pre hrodmadné úpravy produktov, tie sú ale väčšinou veľmi komplexné a môžu spôsobiť spomalenie e-shopu. Z tohto dôdvodu som sa rozhodol naprogramovať vlastnú funkcionalitu pre hromadné pridávanie a odoberanie produktových štítkov, resp. vlastností k produktom.
class PxBulkEditProductLabel {
public string $taxonomy;
public array $terms;
public function __construct( $taxonomy ) {
$this->taxonomy = $taxonomy;
$terms = get_terms( [
'taxonomy' => $this->taxonomy,
'hide_empty' => false,
] );
$this->terms = $terms;
$this->hooks();
}
public function hooks(): void {
/* Bulk Actions */
add_filter( 'bulk_actions-edit-product', [ $this, 'add_bulk_actions' ], 20, 1 );
add_filter( 'handle_bulk_actions-edit-product', [ $this, 'bulk_actions_handle' ], 10, 3 );
/* Admin Product Column */
add_filter( 'manage_edit-product_columns', [ $this, 'custom_product_column' ], 20 );
add_action( 'manage_product_posts_custom_column', [ $this, 'custom_orders_list_column_content' ], 20, 2 );
/* Change Query */
add_action( 'pre_get_posts', [ $this, 'change_query' ] );
}
function add_bulk_actions( $actions ) {
foreach ( $this->terms as $term ) {
$actions[ 'add_tag_' . $term->slug ] = __( 'Pridať štítok ' . $term->name, 'px-invoices' );
$actions[ 'remove_tag_' . $term->slug ] = __( 'Odobrať štítok ' . $term->name, 'px-invoices' );
}
return $actions;
}
function bulk_actions_handle( $redirect_to, $action, $post_ids ) {
if ( ! str_starts_with( $action, 'add_tag_' ) && ! str_starts_with( $action, 'remove_tag_' ) ) {
return $redirect_to;
}
$term_id = str_replace( 'add_tag_', '', $action );
$term_id = str_replace( 'remove_tag_', '', $term_id );
foreach ( $post_ids as $post_id ) {
$term = get_term_by( 'slug', $term_id, $this->taxonomy );
if ( $term ) {
$attributes = get_post_meta( $post_id, '_product_attributes', 1 );
if(!is_array($attributes)) {
$attributes = [];
}
if ( str_starts_with( $action, 'remove' ) ) {
unset( $attributes[ $this->taxonomy ] );
wp_remove_object_terms( $post_id, $term->name, $this->taxonomy );
} else {
wp_set_object_terms( $post_id, $term->name, $this->taxonomy );
$attributes[ $this->taxonomy ] = array(
'name' => $this->taxonomy,
'value' => $term->name,
'is_visible' => '0',
'is_taxonomy' => '1',
'is_variation' => '0',
);
}
update_post_meta( $post_id, '_product_attributes', $attributes );
}
}
return $redirect_to = add_query_arg( array(
$action => '1',
'processed_count' => count( $post_ids ),
), $redirect_to );
}
/* Admin Order Columns */
function custom_product_column( $columns ): array {
$reordered_columns = array();
foreach ( $columns as $key => $column ) {
$reordered_columns[ $key ] = $column;
if ( $key == 'price' ) {
// Inserting after "Status" column
$reordered_columns['px_labels'] = __( 'Štítky', 'pixeler' );
}
}
return $reordered_columns;
}
function custom_orders_list_column_content( $column, $post_id ): void {
switch ( $column ) {
case 'px_labels' :
$terms = get_the_terms( $post_id, $this->taxonomy );
if ( ! empty( $terms ) ) {
foreach ( $terms as $term ) {
$edit_url = admin_url( 'edit.php?post_type=product&' . $this->taxonomy . '=' . $term->slug );
echo '' . $term->name . ',';
}
}
break;
}
}
/* Admin Product Filter Query */
function change_query( $query ): void {
if ( is_admin() && $query->get( 'post_type' ) == 'product' ) {
if ( isset( $_GET[$this->taxonomy] ) ) {
$query->set( 'tax_query', [
[
'taxonomy' => $this->taxonomy,
'terms' => $_GET[$this->taxonomy],
'field' => 'slug',
]
] );
}
}
}
}
add_action( 'init', function () {
$PxBulkEditProductLabel = new PxBulkEditProductLabel( 'pa_stitok' );
}, 999999 );
Tento kód je potrebné vložiť do functions.php témy alebo ako snippet pomocou niektorého z pluginov. Jediným parametrom je slug taxonómie predstavujúcu vlastnosť pre štítky, v našom prípade je to pa_stitok.
Výsledkom je dynamické pridanie hromadných akcií pre pridávanie a odoberanie vlastností k produktom ako aj samotné zobrazenie priradených vlastností v samostatnom stĺpci a filtrovanie podľa nich.