define_hooks();
}
/**
* Define hooks
*/
private function define_hooks(): void {
if ( tinv_get_option( 'topline', 'menu' ) && ! is_admin() ) {
add_filter( 'wp_get_nav_menu_items', array( $this, 'add_to_menu' ), 999, 3 );
}
}
/**
* Adds a wishlist link to the menu.
*
* @param array $items An array of menu item post objects.
* @param object $menu The menu object.
* @param array $args An array of arguments used to retrieve menu item objects.
*
* @return array
*/
public function add_to_menu( $items, $menu, $args ) {
$menu_cnt = count( $items ) + 1;
$menu_ids = tinv_get_option( 'topline', 'menu' );
if ( ! is_array( $menu_ids ) ) {
$menu_ids = array( $menu_ids );
$menu_ids = array_filter( $menu_ids );
}
foreach ( $menu_ids as $menu_id ) {
if ( apply_filters( 'wpml_object_id', absint( $menu_id ), 'nav_menu', true ) == $menu->term_id && apply_filters( 'tinvwl_add_to_menu', true, $menu_id ) ) {
$menu_order = tinv_get_option( 'topline', 'menu_order' ) ? tinv_get_option( 'topline', 'menu_order' ) : 100;
// Item title.
$show_icon = (bool) tinv_get_option( 'topline', 'icon' );
$icon_type = tinv_get_option( 'topline', 'icon' );
$icon_class = ( $show_icon && tinv_get_option( 'topline', 'icon' ) ) ? 'top_wishlist-' . tinv_get_option( 'topline', 'icon' ) : '';
$icon_style = ( $show_icon && tinv_get_option( 'topline', 'icon' ) ) ? esc_attr( 'top_wishlist-' . tinv_get_option( 'topline', 'icon_style' ) ) : '';
$icon_upload = tinv_get_option( 'topline', 'icon_upload' );
$counter = tinv_get_option( 'topline', 'show_counter' ) ? '' : '';
$text = tinv_get_option( 'topline', 'show_text' ) ? apply_filters( 'tinvwl_wishlist_products_counter_text', tinv_get_option( 'topline', 'text' ) ) : '';
$icon = '';
if ( $icon_class && 'custom' === $icon_type && ! empty( $icon_upload ) ) {
$icon .= sprintf( '', esc_url( $icon_upload ), esc_attr( $text ) );
}
$icon .= '';
$menu_title = apply_filters( 'tinvwl_wishlist_products_counter_menu_html', $icon . ' ' . $text . ' ' . $counter, $icon, $text, $counter );
if ( $menu_title ) {
$wishlist_item = (object) array(
'ID' => $menu_cnt + 2147480000,
'object_id' => apply_filters( 'wpml_object_id', tinv_get_option( 'page', 'wishlist' ), 'page', true ),
'db_id' => $menu_cnt + 2147480000,
'title' => $menu_title,
'url' => esc_url( tinv_url_wishlist_default() ),
'menu_order' => $menu_order,
'menu_item_parent' => 0,
'type' => 'post',
'post_parent' => 0,
'filter' => 'raw',
'target' => '',
'attr_title' => '',
'object' => get_post_type( get_post( apply_filters( 'wpml_object_id', tinv_get_option( 'page', 'wishlist' ), 'page', true ) ) ),
'classes' => array(),
'description' => '',
'xfn' => '',
'status' => '',
);
foreach ( array_keys( $items ) as $key ) {
if ( $items[ $key ]->menu_order > ( $menu_order - 1 ) ) {
$items[ $key ]->menu_order = $items[ $key ]->menu_order + 1;
}
}
if ( $menu_order < $menu_cnt ) {
array_splice( $items, $menu_order - 1, 0, array( $wishlist_item ) );
} else {
$items[] = $wishlist_item;
}
}
}
}
return $items;
}
/**
* Outputs the HTML.
*
* @param array $atts Shortcode attributes.
*/
function htmloutput( $atts ) {
$data = array(
'icon' => tinv_get_option( 'topline', 'icon' ),
'icon_class' => ( $atts['show_icon'] && tinv_get_option( 'topline', 'icon' ) ) ? 'top_wishlist-' . tinv_get_option( 'topline', 'icon' ) : '',
'icon_style' => ( $atts['show_icon'] && tinv_get_option( 'topline', 'icon' ) ) ? esc_attr( 'top_wishlist-' . tinv_get_option( 'topline', 'icon_style' ) ) : '',
'icon_upload' => tinv_get_option( 'topline', 'icon_upload' ),
'text' => $atts['show_text'] ? $atts['text'] : '',
'counter' => $atts['show_counter'],
'show_counter' => $atts['show_counter'],
);
tinv_wishlist_template( 'ti-wishlist-product-counter.php', $data );
}
function get_counter() {
return $this->counter ? $this->counter : $this->counter();
}
function get_user_wishlists() {
return $this->user_wishlists ? $this->user_wishlists : $this->user_wishlists();
}
function get_guest_wishlist() {
return $this->guest_wishlist ? $this->guest_wishlist : $this->guest_wishlist();
}
function guest_wishlist() {
$wl = new TInvWL_Wishlist();
$wishlist = $wl->get_by_sharekey_default();
$this->guest_wishlist = $wishlist;
return $wishlist;
}
function user_wishlists() {
$wl = new TInvWL_Wishlist();
return $wl->add_user_default();
}
/**
* Gets the count of the product in all wishlists.
*
* @return int
*/
public function counter() {
global $wpdb;
$count = 0;
if ( is_user_logged_in() ) {
$wishlist = $this->get_user_wishlists();
$wlp = new TInvWL_Product();
$counts = $wlp->get( array(
'external' => false,
'wishlist_id' => $wishlist['ID'],
'sql' => 'SELECT COUNT(`quantity`) AS `quantity` FROM {table} t1 INNER JOIN ' . $wpdb->prefix . 'posts t2 on t1.product_id = t2.ID AND t2.post_status IN ("publish","private") WHERE {where} ',
) );
$counts = array_shift( $counts );
$count = absint( $counts['quantity'] );
} else {
$wishlist = $this->get_guest_wishlist();
if ( ! empty( $wishlist ) ) {
$wishlist = array_shift( $wishlist );
$wlp = new TInvWL_Product( $wishlist );
$counts = $wlp->get_wishlist( array(
'external' => false,
'sql' => sprintf( 'SELECT %s(`quantity`) AS `quantity` FROM {table} t1 INNER JOIN ' . $wpdb->prefix . 'posts t2 on t1.product_id = t2.ID AND t2.post_status IN ("publish","private") WHERE {where}', 'COUNT' ),
) );
$counts = array_shift( $counts );
$count = absint( $counts['quantity'] );
}
}
return $count ? $count : ( tinv_get_option( 'topline', 'hide_zero_counter' ) ? false : 0 );
}
/**
* Processes the shortcode.
*
* @param array $atts Array parameter from shortcode.
*
* @return string
*/
function shortcode( $atts = array() ) {
$default = array(
'show_icon' => (bool) tinv_get_option( 'topline', 'icon' ),
'show_text' => tinv_get_option( 'topline', 'show_text' ),
'text' => apply_filters( 'tinvwl_wishlist_products_counter_text', tinv_get_option( 'topline', 'text' ) ),
'show_counter' => tinv_get_option( 'topline', 'show_counter' ),
);
$atts = filter_var_array( shortcode_atts( $default, $atts ), array(
'show_icon' => FILTER_VALIDATE_BOOLEAN,
'show_text' => FILTER_VALIDATE_BOOLEAN,
'show_counter' => FILTER_VALIDATE_BOOLEAN,
'text' => FILTER_DEFAULT,
) );
ob_start();
$this->htmloutput( $atts );
return ob_get_clean();
}
}