/**
* WooCommerce Account Functions
*
* Functions for account specific things.
*
* @package WooCommerce\Functions
* @version 2.6.0
*/
use Automattic\WooCommerce\Enums\OrderStatus;
defined( 'ABSPATH' ) || exit;
/**
* Returns the url to the lost password endpoint url.
*
* @param string $default_url Default lost password URL.
* @return string
*/
function wc_lostpassword_url( $default_url = '' ) {
// Avoid loading too early.
if ( ! did_action( 'init' ) ) {
return $default_url;
}
// Don't change the admin form.
if ( did_action( 'login_form_login' ) ) {
return $default_url;
}
// Don't redirect to the woocommerce endpoint on global network admin lost passwords.
if ( is_multisite() && isset( $_GET['redirect_to'] ) && false !== strpos( wp_unslash( $_GET['redirect_to'] ), network_admin_url() ) ) { // WPCS: input var ok, sanitization ok, CSRF ok.
return $default_url;
}
$wc_account_page_url = wc_get_page_permalink( 'myaccount' );
$wc_account_page_exists = wc_get_page_id( 'myaccount' ) > 0;
$lost_password_endpoint = get_option( 'woocommerce_myaccount_lost_password_endpoint' );
if ( $wc_account_page_exists && ! empty( $lost_password_endpoint ) ) {
return wc_get_endpoint_url( $lost_password_endpoint, '', $wc_account_page_url );
} else {
return $default_url;
}
}
add_filter( 'lostpassword_url', 'wc_lostpassword_url', 10, 1 );
/**
* Get the link to the edit account details page.
*
* @return string
*/
function wc_customer_edit_account_url() {
$edit_account_url = wc_get_endpoint_url( 'edit-account', '', wc_get_page_permalink( 'myaccount' ) );
return apply_filters( 'woocommerce_customer_edit_account_url', $edit_account_url );
}
/**
* Get the edit address slug translation.
*
* @param string $id Address ID.
* @param bool $flip Flip the array to make it possible to retrieve the values from both sides.
*
* @return string Address slug i18n.
*/
function wc_edit_address_i18n( $id, $flip = false ) {
$slugs = apply_filters(
'woocommerce_edit_address_slugs',
array(
'billing' => sanitize_title( _x( 'billing', 'edit-address-slug', 'woocommerce' ) ),
'shipping' => sanitize_title( _x( 'shipping', 'edit-address-slug', 'woocommerce' ) ),
)
);
if ( $flip ) {
$slugs = array_flip( $slugs );
}
if ( ! isset( $slugs[ $id ] ) ) {
return $id;
}
return $slugs[ $id ];
}
/**
* Get My Account menu items.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_menu_items() {
$endpoints = array(
'orders' => get_option( 'woocommerce_myaccount_orders_endpoint', 'orders' ),
'downloads' => get_option( 'woocommerce_myaccount_downloads_endpoint', 'downloads' ),
'edit-address' => get_option( 'woocommerce_myaccount_edit_address_endpoint', 'edit-address' ),
'payment-methods' => get_option( 'woocommerce_myaccount_payment_methods_endpoint', 'payment-methods' ),
'edit-account' => get_option( 'woocommerce_myaccount_edit_account_endpoint', 'edit-account' ),
'customer-logout' => get_option( 'woocommerce_logout_endpoint', 'customer-logout' ),
);
$items = array(
'dashboard' => __( 'Dashboard', 'woocommerce' ),
'orders' => __( 'Orders', 'woocommerce' ),
'downloads' => __( 'Downloads', 'woocommerce' ),
'edit-address' => _n( 'Address', 'Addresses', ( 1 + (int) wc_shipping_enabled() ), 'woocommerce' ),
'payment-methods' => __( 'Payment methods', 'woocommerce' ),
'edit-account' => __( 'Account details', 'woocommerce' ),
'customer-logout' => __( 'Log out', 'woocommerce' ),
);
// Remove missing endpoints.
foreach ( $endpoints as $endpoint_id => $endpoint ) {
if ( empty( $endpoint ) ) {
unset( $items[ $endpoint_id ] );
}
}
// Check if payment gateways support add new payment methods.
if ( isset( $items['payment-methods'] ) ) {
$support_payment_methods = false;
foreach ( WC()->payment_gateways->get_available_payment_gateways() as $gateway ) {
if ( $gateway->supports( 'add_payment_method' ) || $gateway->supports( 'tokenization' ) ) {
$support_payment_methods = true;
break;
}
}
if ( ! $support_payment_methods ) {
unset( $items['payment-methods'] );
}
}
return apply_filters( 'woocommerce_account_menu_items', $items, $endpoints );
}
/**
* Find current item in account menu.
*
* @since 9.3.0
* @param string $endpoint Endpoint.
* @return bool
*/
function wc_is_current_account_menu_item( $endpoint ) {
global $wp;
$current = isset( $wp->query_vars[ $endpoint ] );
if ( 'dashboard' === $endpoint && ( isset( $wp->query_vars['page'] ) || empty( $wp->query_vars ) ) ) {
$current = true; // Dashboard is not an endpoint, so needs a custom check.
} elseif ( 'orders' === $endpoint && isset( $wp->query_vars['view-order'] ) ) {
$current = true; // When looking at individual order, highlight Orders list item (to signify where in the menu the user currently is).
} elseif ( 'payment-methods' === $endpoint && isset( $wp->query_vars['add-payment-method'] ) ) {
$current = true;
}
return $current;
}
/**
* Get account menu item classes.
*
* @since 2.6.0
* @param string $endpoint Endpoint.
* @return string
*/
function wc_get_account_menu_item_classes( $endpoint ) {
$classes = array(
'woocommerce-MyAccount-navigation-link',
'woocommerce-MyAccount-navigation-link--' . $endpoint,
);
if ( wc_is_current_account_menu_item( $endpoint ) ) {
$classes[] = 'is-active';
}
$classes = apply_filters( 'woocommerce_account_menu_item_classes', $classes, $endpoint );
return implode( ' ', array_map( 'sanitize_html_class', $classes ) );
}
/**
* Get account endpoint URL.
*
* @since 2.6.0
* @param string $endpoint Endpoint.
* @return string
*/
function wc_get_account_endpoint_url( $endpoint ) {
if ( 'dashboard' === $endpoint ) {
return wc_get_page_permalink( 'myaccount' );
}
$url = wc_get_endpoint_url( $endpoint, '', wc_get_page_permalink( 'myaccount' ) );
if ( 'customer-logout' === $endpoint ) {
return wp_nonce_url( $url, 'customer-logout' );
}
return $url;
}
/**
* Get My Account > Orders columns.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_orders_columns() {
/**
* Filters the array of My Account > Orders columns.
*
* @since 2.6.0
* @param array $columns Array of column labels keyed by column IDs.
*/
return apply_filters(
'woocommerce_account_orders_columns',
array(
'order-number' => __( 'Order', 'woocommerce' ),
'order-date' => __( 'Date', 'woocommerce' ),
'order-status' => __( 'Status', 'woocommerce' ),
'order-total' => __( 'Total', 'woocommerce' ),
'order-actions' => __( 'Actions', 'woocommerce' ),
)
);
}
/**
* Get My Account > Downloads columns.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_downloads_columns() {
$columns = apply_filters(
'woocommerce_account_downloads_columns',
array(
'download-product' => __( 'Product', 'woocommerce' ),
'download-remaining' => __( 'Downloads remaining', 'woocommerce' ),
'download-expires' => __( 'Expires', 'woocommerce' ),
'download-file' => __( 'Download', 'woocommerce' ),
'download-actions' => ' ',
)
);
if ( ! has_filter( 'woocommerce_account_download_actions' ) ) {
unset( $columns['download-actions'] );
}
return $columns;
}
/**
* Get My Account > Payment methods columns.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_payment_methods_columns() {
return apply_filters(
'woocommerce_account_payment_methods_columns',
array(
'method' => __( 'Method', 'woocommerce' ),
'expires' => __( 'Expires', 'woocommerce' ),
'actions' => ' ',
)
);
}
/**
* Get My Account > Payment methods types
*
* @since 2.6.0
* @return array
*/
function wc_get_account_payment_methods_types() {
return apply_filters(
'woocommerce_payment_methods_types',
array(
'cc' => __( 'Credit card', 'woocommerce' ),
'echeck' => __( 'eCheck', 'woocommerce' ),
)
);
}
/**
* Get account orders actions.
*
* @since 3.2.0
* @param int|WC_Order $order Order instance or ID.
* @return array
*/
function wc_get_account_orders_actions( $order ) {
if ( ! is_object( $order ) ) {
$order_id = absint( $order );
$order = wc_get_order( $order_id );
}
$actions = array(
'pay' => array(
'url' => $order->get_checkout_payment_url(),
'name' => __( 'Pay', 'woocommerce' ),
/* translators: %s: order number */
'aria-label' => sprintf( __( 'Pay for order %s', 'woocommerce' ), $order->get_order_number() ),
),
'view' => array(
'url' => $order->get_view_order_url(),
'name' => __( 'View', 'woocommerce' ),
/* translators: %s: order number */
'aria-label' => sprintf( __( 'View order %s', 'woocommerce' ), $order->get_order_number() ),
),
'cancel' => array(
'url' => $order->get_cancel_order_url( wc_get_page_permalink( 'myaccount' ) ),
'name' => __( 'Cancel', 'woocommerce' ),
/* translators: %s: order number */
'aria-label' => sprintf( __( 'Cancel order %s', 'woocommerce' ), $order->get_order_number() ),
),
);
if ( ! $order->needs_payment() ) {
unset( $actions['pay'] );
}
/**
* Filters the valid order statuses for cancel action.
*
* @since 3.2.0
*
* @param array $statuses_for_cancel Array of valid order statuses for cancel action.
* @param WC_Order $order Order instance.
*/
$statuses_for_cancel = apply_filters( 'woocommerce_valid_order_statuses_for_cancel', array( OrderStatus::PENDING, OrderStatus::FAILED ), $order );
if ( ! in_array( $order->get_status(), $statuses_for_cancel, true ) ) {
unset( $actions['cancel'] );
}
return apply_filters( 'woocommerce_my_account_my_orders_actions', $actions, $order );
}
/**
* Get account formatted address.
*
* @since 3.2.0
* @param string $address_type Type of address; 'billing' or 'shipping'.
* @param int $customer_id Customer ID.
* Defaults to 0.
* @return string
*/
function wc_get_account_formatted_address( $address_type = 'billing', $customer_id = 0 ) {
$getter = "get_{$address_type}";
$address = array();
if ( 0 === $customer_id ) {
$customer_id = get_current_user_id();
}
$customer = new WC_Customer( $customer_id );
if ( is_callable( array( $customer, $getter ) ) ) {
$address = $customer->$getter();
unset( $address['email'], $address['tel'] );
}
return WC()->countries->get_formatted_address( apply_filters( 'woocommerce_my_account_my_address_formatted_address', $address, $customer->get_id(), $address_type ) );
}
/**
* Returns an array of a user's saved payments list for output on the account tab.
*
* @since 2.6
* @param array $list List of payment methods passed from wc_get_customer_saved_methods_list().
* @param int $customer_id The customer to fetch payment methods for.
* @return array Filtered list of customers payment methods.
*/
function wc_get_account_saved_payment_methods_list( $list, $customer_id ) {
$payment_tokens = WC_Payment_Tokens::get_customer_tokens( $customer_id );
foreach ( $payment_tokens as $payment_token ) {
$delete_url = wc_get_endpoint_url( 'delete-payment-method', $payment_token->get_id() );
$delete_url = wp_nonce_url( $delete_url, 'delete-payment-method-' . $payment_token->get_id() );
$set_default_url = wc_get_endpoint_url( 'set-default-payment-method', $payment_token->get_id() );
$set_default_url = wp_nonce_url( $set_default_url, 'set-default-payment-method-' . $payment_token->get_id() );
$type = strtolower( $payment_token->get_type() );
$list[ $type ][] = array(
'method' => array(
'gateway' => $payment_token->get_gateway_id(),
),
'expires' => esc_html__( 'N/A', 'woocommerce' ),
'is_default' => $payment_token->is_default(),
'actions' => array(
'delete' => array(
'url' => $delete_url,
'name' => esc_html__( 'Delete', 'woocommerce' ),
),
),
);
$key = key( array_slice( $list[ $type ], -1, 1, true ) );
if ( ! $payment_token->is_default() ) {
$list[ $type ][ $key ]['actions']['default'] = array(
'url' => $set_default_url,
'name' => esc_html__( 'Make default', 'woocommerce' ),
);
}
$list[ $type ][ $key ] = apply_filters( 'woocommerce_payment_methods_list_item', $list[ $type ][ $key ], $payment_token );
}
return $list;
}
add_filter( 'woocommerce_saved_payment_methods_list', 'wc_get_account_saved_payment_methods_list', 10, 2 );
/**
* Controls the output for credit cards on the my account page.
*
* @since 2.6
* @param array $item Individual list item from woocommerce_saved_payment_methods_list.
* @param WC_Payment_Token $payment_token The payment token associated with this method entry.
* @return array Filtered item.
*/
function wc_get_account_saved_payment_methods_list_item_cc( $item, $payment_token ) {
if ( 'cc' !== strtolower( $payment_token->get_type() ) ) {
return $item;
}
$card_type = $payment_token->get_card_type();
$item['method']['last4'] = $payment_token->get_last4();
$item['method']['brand'] = ( ! empty( $card_type ) ? ucwords( str_replace( '_', ' ', $card_type ) ) : esc_html__( 'Credit card', 'woocommerce' ) );
$item['expires'] = $payment_token->get_expiry_month() . '/' . substr( $payment_token->get_expiry_year(), -2 );
return $item;
}
add_filter( 'woocommerce_payment_methods_list_item', 'wc_get_account_saved_payment_methods_list_item_cc', 10, 2 );
/**
* Controls the output for eChecks on the my account page.
*
* @since 2.6
* @param array $item Individual list item from woocommerce_saved_payment_methods_list.
* @param WC_Payment_Token $payment_token The payment token associated with this method entry.
* @return array Filtered item.
*/
function wc_get_account_saved_payment_methods_list_item_echeck( $item, $payment_token ) {
if ( 'echeck' !== strtolower( $payment_token->get_type() ) ) {
return $item;
}
$item['method']['last4'] = $payment_token->get_last4();
$item['method']['brand'] = esc_html__( 'eCheck', 'woocommerce' );
return $item;
}
add_filter( 'woocommerce_payment_methods_list_item', 'wc_get_account_saved_payment_methods_list_item_echeck', 10, 2 );
Τα γραφικά είναι εκθαμβωτικά, με ζωντανά χρώματα και λεπτομερείς εικόνες που αναδεικνύουν τη δυναμική ατμόσφαιρα του παιχνιδιού. Για να παίξετε τον κουλοχέρη rise of olympus σε κινητές συσκευές διαφορετικών λειτουργικών συστημάτων, πρέπει να χρησιμοποιήσετε ένα πρόγραμμα περιήγησης. Με φόντο νησιά στον ουρανό πάνω από τον Όλυμπο, το πλέγμα συμβόλων 5×5 περιλαμβάνει σύμβολα «κειμηλίων», όπως η αστραπή, το κράνος και η τρίαινα, καθώς και τους θεούς Ποσειδώνα, Άδη και Δία. Είναι ένα κλασικό παράδειγμα παιχνιδιού με ελληνικό θέμα και ταιριάζει απόλυτα με άλλα παιχνίδια της ίδιας σειράς από την Play’n GO, όπως το Rise of Olympus και το Rise of Olympus 100. Για να μπορέσετε να παίξετε με πραγματικά χρήματα το Rise of Olympus, θα πρέπει αρχικά να έχετε έναν προσωπικό λογαριασμό στο καζίνο. Αυτό το επίπεδο μεταβλητότητας είναι ευνοϊκό για παίκτες που επιθυμούν συνεχείς, αλλά όχι εξαιρετικά μεγάλες νίκες, προσφέροντας έτσι μια ισορροπημένη εμπειρία παιχνιδιού. Φτάνει λοιπόν μέχρι και το 96.5% και υπόσχεται παιχνίδι μέσα από το οποίο μπορείτε να έχετε σεβαστές πιθανότητες για να αποκομίσετε κάποιο κέρδος. Επιπροσθέτως το ελάχιστο και το μέγιστο ποντάρισμα δημιουργούν ανάμεσά τους ένα ευρύ φάσμα, μέσα στο οποίο χωράνε παίκτες με διαφορετικές οικονομικές δυνατότητες. Μπορείτε να ρισκάρετε λοιπόν μόνο 0.20€ ανά σπινάρισμα ή να πάρετε πολύ μεγαλύτερα ρίσκα να τοποθετήσετε μέχρι και 100€ σε ένα και μόνο πάτημα κουμπιού. Στη λειτουργία δοκιμής, χρησιμοποιείτε εικονικό χρήμα για το στοίχημα και τις κερδοφόρες. Αυτό σημαίνει ότι δεν υπάρχει κανένα ρίσκο απώλειας πραγματικού χρήματος κατά τη διάρκεια του παιχνιδιού. Καλώς ήρθατε στην κριτική του Rise of Olympus 100, ενός από τους πιο δημοφιλείς κουλοχέρηδες καζίνο. Σε αυτήν την ανασκόπηση, θα επικεντρωθούμε στην παρουσίαση των κύριων χαρακτηριστικών του παιχνιδιού και των κανόνων που διέπουν τις στοιχηματικές σας επιλογές. Πριν ξεκινήσετε το ταξίδι σας στον κόσμο της κουλοχέρης, ας σας καθοδηγήσουμε στις λεπτομέρειες που πρέπει να γνωρίζετε για να απολαύσετε το παιχνίδι με ασφάλεια και κατανόηση. Το ποσοστό επιστροφής στον παίκτη (RTP) του παιχνιδιού “Rise of Olympus” είναι 96%, παρέχοντας στους παίκτες μια αρκετά ευνοϊκή πιθανότητα να κερδίσουν. Ο ιστότοπος προορίζεται μόνο για ενημερωτικούς σκοπούς για τους λάτρεις της ψυχαγωγίας του τζόγου. Έτσι, έχουμε δει και μια αναβάθμιση του παιχνιδιού στο Rise of Olympus 100, το οποίο έχει υψηλότερο max win. Και οι δύο γύροι μπόνους προσφέρουν μοναδικά χαρακτηριστικά και μεγάλες πιθανότητες να κερδίσετε. Αντικαθιστά οποιοδήποτε άλλο σύμβολο εκτός από το σύμβολο scatter, το οποίο βοηθά στη δημιουργία νικηφόρων συνδυασμών. Αυτά τα κουμπιά ελέγχου επιτρέπουν στον παίκτη να προσαρμόσει το κουλοχέρη στις ατομικές του προτιμήσεις και να το απολαύσει στο έπακρο. Η διακύμανση επηρεάζει την εμπειρία του παίκτη, καθώς δημιουργεί αίσθηση αγωνίας και αναμονής για τις μεγάλες νίκες. Έτσι, θα έχετε πλήρη εικόνα για το gameplay, τις πληρωμές και τις λεπτομέρειες στους μηχανισμούς του παιχνιδιού, αποφεύγοντας λάθη που πιθανώς να σας κοστίσουν. Και το πιο βασικό, φυσικά, θα διαπιστώσετε αν το Rise of Olympus σας ελκύει χωρίς να χρειαστεί να ρισκάρετε τα χρήματά σας. Το Rise of Olympus 100 Demo είναι η δωρεάν έκδοση του δημοφιλούς slot της Play’n GO που φέρνει στην οθόνη σας τη δύναμη των τριών ισχυρότερων θεών της αρχαίας Ελλάδας – Δία, Ποσειδώνα και Άδη. Οι καταρράκτες ενεργοποιούνται σε κάθε νίκη και επαναλαμβάνονται χωρίς όριο μέχρι να μην υπάρχουν νέα νικηφόρα συμπλέγματα. Συνδυασμοί χαμηλότερης αξίας αφήνουν πίσω τους σύμβολα μπαλαντέρ, τα οποία βοηθούν στη δημιουργία περαιτέρω συστάδων, ενώ παράλληλα ενισχύουν τους πανίσχυρους θεούς. Μπορείτε να παίξετε το slot Rise of Olympus 100 με μέγιστο ποντάρισμα 9 ευρώ σε κάθε περιστροφή. Θα πρέπει φυσικά να παίζετε πάντα στο slot rise of olympus δωρεάν πλαίσιο των χρηματικών δυνατοτήτων σας και μπορείτε να μειώσετε το ποντάρισμα στο ελάχιστο μόλις 0,20. Το online video slot Rise of Olympus 100 πληρώνει ένα έπαθλο όταν τοποθετήσετε τουλάχιστον 3 ίδια σύμβολα οριζόντια ή κάθετα στο πλέγμα 5×5. Το Sweet Bonanza 1000 Demo είναι η δωρεάν έκδοση του δημοφιλούς candy-themed slot της Pragmatic Play που προσφέρει εντυπωσιακούς πολλαπλασιαστές έως 1000x. Κάθε θεός στο παιχνίδι έχει το δικό του μοναδικό στυλ και δυνάμεις, που όχι μόνο προσδίδουν ποικιλία στον τρόπο παιχνιδιού αλλά επίσης προσθέτουν βάθος στην εμπειρία. Η αισθητική του παιχνιδιού είναι μια από τις πιο εντυπωσιακές στον κλάδο, με την προσοχή στη λεπτομέρεια να φαίνεται σε κάθε γωνία της οθόνης. Το Rise of Olympus δεν είναι απλά ένας κουλοχέρης, αλλά μια πολυδιάστατη εμπειρία παιχνιδιού που προσφέρει στους παίκτες μια γοητευτική βουτιά στον κόσμο της ελληνικής μυθολογίας με μια σύγχρονη στροφή. Το RTP (Return to Player) είναι το ποσοστό των συνολικών στοιχημάτων που επιστρέφεται στους παίκτες με τη μορφή κερδών μακροπρόθεσμα. Αυτό είναι ο μέσος όρος για τους σύγχρονους τηλεοπτικούς κουλοχέρηδες, υποδεικνύοντας μια ισορροπημένη πιθανότητα κέρδους. Ο κουλοχέρης Rise Of Olympus Origins από την Play’n GO είναι ένα από τα δημοφιλή παιχνίδια που βασίζονται στην αρχαία ελληνική μυθολογία. Κεραυνοί, τρίαινες και θεοί εμφανίζονται σε 5 τροχούς, 5 σειρές και πληρώνουν βραβεία όταν τουλάχιστον 3 του ίδιου είδους προσγειώνονται σε ομάδες. Δοκιμάστε το σε αξιόπιστα καζίνο, ενώ αξίζει να αναλογιστείτε και την δωρεάν δοκιμή του πριν παίξετε με πραγματικά χρήματα. Όλα σχεδόν τα καζίνο εστιάζουν σε γενναιόδωρα μπόνους καλωσορίσματος, τα οποία αφορούν μπόνους κατάθεσης σε σχετικά μεγάλα ποσά. Ωστόσο, μπορείτε να βρείτε και πλατφόρμες που έχουν αντίστοιχες προσφορές σε εβδομαδιαία βάση. Αυτό σημαίνει ότι οι κερδοφόρες συνδυασμένες αλληλουχίες ενδέχεται να εμφανίζονται λιγότερο συχνά, αλλά όταν εμφανιστούν, μπορεί να προσφέρουν μεγαλύτερα κέρδη. Τα Instant Casino προσφέρουν άμεση πρόσβαση σε κορυφαία παιχνίδια καζίνο χωρίς χρονοβόρες διαδικασίες εγγραφής και επαλήθευσης. Παίξτε τον κουλοχέρη Rise of Olympus 100 στα καλύτερα καζίνο live της Play’n GO που παρουσιάζονται εδώ και ανακαλύψτε τη δύναμη των Ελλήνων Θεών σήμερα. Το κουλοχέρη αναπτύσσεται από την Play’n GO, μια από τις κορυφαίες εταιρείες λογισμικού καζίνο. Το RTP αναφέρεται στο ποσοστό των συνολικών στοιχημάτων που επιστρέφεται στους παίκτες σε μακροπρόθεσμη βάση.
Rise of Olympus 100 Demo: Ανακαλύψτε τη Θεϊκή Δύναμη Χωρίς Κόστος
Αν σας άρεσε
Σύμβολα και χαρακτηριστικά του παιχνιδιού