HEX
Server: Apache
System: Linux webd001.cluster127.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User: mciraet (192513)
PHP: 8.2.31
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/mciraet/www/wp-content/themes/movedo-child/functions.php
<?php



function force_shipping_address_display() {
    return true;
}
add_filter( 'woocommerce_cart_needs_shipping_address', 'force_shipping_address_display' );
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );





// Désactiver l'email d'administration pour le changement de statut de la commande
add_filter('woocommerce_email_enabled_order_status_changed', '__return_false');

// Désactiver les notifications d'ajout/retir de moyens de paiement
add_filter('woocommerce_email_enabled_payment_method_added', '__return_false');
add_filter('woocommerce_email_enabled_payment_method_removed', '__return_false');

// Désactiver les notifications pour les changements de facturation et de livraison
add_filter('woocommerce_email_enabled_billing_address_changed', '__return_false');
add_filter('woocommerce_email_enabled_shipping_address_changed', '__return_false');

// Désactiver les notifications de la création de compte (par défaut WordPress)
add_filter('send_new_user_notifications', '__return_false');

// Désactiver les notifications de changement de mot de passe
add_filter('send_password_change_email', '__return_false');


?>






<?php
add_filter('gettext', 'custom_mailchimp_labels_translation', 10, 3);

function custom_mailchimp_labels_translation($translated_text, $text, $domain) {
    // Vérifier que le domaine correspond à Mailchimp for WooCommerce
    if ($domain == 'mailchimp-for-woocommerce') {

        // Détection de la langue active de WordPress
        if (function_exists('pll_current_language')) {
            $current_language = pll_current_language(); // Pour Polylang
        } else {
            $current_language = get_locale(); // Pour WordPress seul
        }

        // Traduction des textes en fonction de la langue active
        if ($current_language == 'fr') {
            switch ($text) {
                case 'Subscribe to our newsletter':
                    $translated_text = 'S\'abonner à notre newsletter';
                    break;
                case 'Unsubscribe from our newsletter':
                    $translated_text = 'Se désabonner de notre newsletter';
                    break;
                case 'Receive Order Updates':
                    $translated_text = 'Recevoir les mises à jour de commande';
                    break;
            }
        } elseif ($current_language == 'nl') {
            switch ($text) {
                case 'Subscribe to our newsletter':
                    $translated_text = 'Inschrijven voor onze nieuwsbrief';
                    break;
                case 'Unsubscribe from our newsletter':
                    $translated_text = 'Uitschrijven voor onze nieuwsbrief';
                    break;
                case 'Receive Order Updates':
                    $translated_text = 'Ontvang bestelupdates';
                    break;
            }
        }
    }

    return $translated_text;
}




add_filter( 'woocommerce_email_downloads_columns', 'remove_expiration_column' );

function remove_expiration_column( $columns ) {
    // Supprime la colonne "Expiration"
    unset( $columns['download-expires'] );
    return $columns;
}





function test_script() {
    ?>
    <script type="text/javascript">
        console.log('Test script exécuté'); 
    </script>
    <?php
}
add_action('login_enqueue_scripts', 'test_script');








function hide_elements_for_logged_in_users() {
    if (is_user_logged_in()) {
        echo '<style>
            .grve-column-wrapper.vc_custom_1722341780583, 
            .grve-column-wrapper.vc_custom_1722341904990 {
                display: none !important;
            }
        </style>';
    }
}
add_action('wp_head', 'hide_elements_for_logged_in_users');



function user_has_active_subscription() {
    if (!function_exists('wc_get_orders') || !class_exists('WooCommerce')) return false;
    
    $user_id = get_current_user_id();
    if ($user_id == 0) return false;

 
    $allowed_product_ids = array(4829, 288, 681, 5502, 5483, 4828, 289, 680, 11446, 11445, 11444, 11443, 11442, 11441, 11436, 1143, 11513, 11512, 11509, 11508, 11506, 11501, 11446, 11445, 11435 );

    $orders = wc_get_orders(array(
        'customer' => $user_id,
        'status'   => array('completed', 'processing'),
        'limit'    => 5, 
    ));

    if (!empty($orders) && is_array($orders)) {
        foreach ($orders as $order) {
            if ($order instanceof WC_Order) {
                foreach ($order->get_items() as $item) {
                    if ($item instanceof WC_Order_Item_Product) {
                        $product_id = $item->get_product_id();
                        if (in_array($product_id, $allowed_product_ids)) {
                            return true; 
                        }
                    }
                }
            }
        }
    }
    return false;
}

function restrict_access_to_posts() {
    if (!is_user_logged_in() || !user_has_active_subscription()) {
        if (is_single()) {
            $page_slug = function_exists('pll_current_language') && pll_current_language() === 'nl' ? 'mijn-account' : 'mon-compte';
            
            if (!is_page($page_slug)) {
                wp_redirect(home_url('/' . $page_slug . '/'));
                exit;
            }
        }
    }
}

add_action('template_redirect', 'restrict_access_to_posts');





/* FIN PARAM7TRES ACCOUNT */ 


add_filter('woocommerce_account_menu_items', 'custom_woocommerce_account_menu_items', 10, 1);

function custom_woocommerce_account_menu_items($items)
{
    if (function_exists('pll_current_language')) {
        $current_language = pll_current_language();
    } else {
        $current_language = 'fr';
    }

    if (isset($items['downloads'])) {
        if ($current_language == 'fr') {
            $items['downloads'] = __('Carte de membre', 'your-textdomain');
        } elseif ($current_language == 'nl') {
            $items['downloads'] = __('Lidkaart', 'your-textdomain');
        }
    }

    return $items;
}

function custom_message_error_visibility()
{
    if (is_user_logged_in()) {
        echo '<style>
                .message-error {
                    display: visible;
                }
              </style>';
    } else {
        echo '<style>
                .message-error {
                    display: none;
                }
              </style>';
    }
}
add_action('wp_head', 'custom_message_error_visibility');
function custom_message_error_visibilit()
{
    if (is_user_logged_in()) {
        echo '<style>
                .grve-section.grve-row-section.grve-fullwidth-background.grve-bg-none.section-connexion .grve-container .grve-row.grve-bookmark.grve-columns-gap-30 .grve-column.wpb_column.grve-column-1-2 {
                    width: 100%;
                }
              </style>';
    } else {
        echo '<style>
                .grve-section.grve-row-section.grve-fullwidth-background.grve-bg-none.section-connexion .grve-container .grve-row.grve-bookmark.grve-columns-gap-30 .grve-column.wpb_column.grve-column-1-2 {
                    width: 50%;
                }
              </style>';
    }
}
add_action('wp_head', 'custom_message_error_visibilit');

function check_cart_count()
{

    $cart_count = WC()->cart->get_cart_contents_count();

    wp_send_json($cart_count);
    wp_die();
}

add_action('wp_ajax_check_cart_count', 'check_cart_count');
add_action('wp_ajax_nopriv_check_cart_count', 'check_cart_count');



function custom_element_visibility()
{
    if (is_user_logged_in()) {

        echo '<style>
                .gmnoprint.gm-style-mtc-bbw {
                    display: block;
                }
              </style>';
    } else {

        echo '<style>
                .gmnoprint.gm-style-mtc-bbw {
                    display: none;
                }
              </style>';
    }
}
add_action('wp_head', 'custom_element_visibility');



add_action('wp_enqueue_scripts', 'custom_translate_lost_password_text');

function custom_translate_lost_password_text()
{

    if (function_exists('pll_current_language')) {
        $current_language = pll_current_language(); 
    } else {
        $current_language = 'fr'; 
    }

    if ($current_language == 'fr') {
        $translated_text = 'Mot de passe oublié ? Veuillez entrer votre nom d’utilisateur ou votre adresse e-mail. Vous recevrez un lien pour créer un nouveau mot de passe par e-mail.';
    } elseif ($current_language == 'nl') {
        $translated_text = 'Wachtwoord vergeten? Voer uw gebruikersnaam of e-mailadres in. U ontvangt een link om een nieuw wachtwoord aan te maken via e-mail.';
    } else {
        $translated_text = 'Lost your password? Please enter your username or email address. You will receive a link to create a new password via email.'; 
    }

    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function () {
            var lostPasswordText = document.querySelector('.xoo-el-form-txt');
            if (lostPasswordText) {
                lostPasswordText.textContent = '<?php echo esc_js($translated_text); ?>';
            }
        });
    </script>
    <?php
}

add_action('wp_enqueue_scripts', 'custom_translate_forgot_password_btn');

function custom_translate_forgot_password_btn()
{

    if (function_exists('pll_current_language')) {
        $current_language = pll_current_language();
    } else {
        $current_language = 'fr'; 
    }

    if ($current_language == 'fr') {
        $translated_btn_text = 'Mot de passe oublié ?';
    } elseif ($current_language == 'nl') {
        $translated_btn_text = 'Wachtwoord vergeten?';
    } else {
        $translated_btn_text = 'Forgot Password?'; 
    }

    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function () {
            var forgotPasswordBtn = document.querySelector('.xoo-el-lostpw-tgr');
            if (forgotPasswordBtn) {
                forgotPasswordBtn.textContent = '<?php echo esc_js($translated_btn_text); ?>'; 
            }
        });
    </script>
    <?php
}


    function my_custom_login_logo()
    {
        echo '<style type="text/css">
                    body.login div#login h1 a { 
                      background-image:url(' . get_bloginfo('template_directory') . '/logoJOB.png) !important;
                         background-size: 320px;
    height: 200px;
    width: 100%;
                    }
                  </style>';
    }

add_action('login_head', 'my_custom_login_logo');

/* ENLEVER LE BTN CONNEXION */ 

function custom_login_button_visibility() {
    if (is_user_logged_in()) {
        echo '<style>
                .grve-btn.btn-acc-right {
                    display: none !important;
                }
              </style>';
    }
}
add_action('wp_head', 'custom_login_button_visibility');




function add_coupon_title_script() {
    if (is_checkout()) {
        ?>
        <div id="coupon-title" 
             data-title-fr="<?php echo esc_attr(pll__('Si vous avez un code promo mettez-le ici')); ?>" 
             data-title-nl="<?php echo esc_attr(pll__('Als je een promotiecode hebt, voer deze dan hier in ')); ?>" 

             style="display:none;"></div>
        <script type="text/javascript">
            document.addEventListener("DOMContentLoaded", function() {
                var couponTitleElement = document.getElementById('coupon-title');

                if (couponTitleElement) {
                    var lang = '<?php echo pll_current_language(); ?>'; 

                    
                    var titleText = (lang === 'nl') ? couponTitleElement.getAttribute('data-title-nl') : couponTitleElement.getAttribute('data-title-fr');                  

                    var couponDiv = document.querySelector(".coupon");

                    if (couponDiv) {
                       
                        var title = document.createElement("h3");
                        title.innerText = titleText; 

                        couponDiv.parentNode.insertBefore(title, couponDiv);
                    }
                }
            });
        </script>
        <?php
    }
}

add_action('wp_footer', 'add_coupon_title_script');



function custom_redirect_after_password_reset( $user ) {
    wp_set_auth_cookie( $user->ID, true ); 

    // Détecter la langue du site
    $lang = get_bloginfo('language');

    // Définir l'URL de redirection en fonction de la langue
    if ( strpos( $lang, 'fr-' ) !== false ) {
        $redirect_url = '/devenir-membre/';
    } elseif ( strpos( $lang, 'nl-' ) !== false ) {
        $redirect_url = 'nl/winkel/';
    } else {
        // Fallback en cas de langue inconnue
        $redirect_url = '/devenir-membre/';
    }

    wp_safe_redirect( $redirect_url );
    exit;
}

add_action('after_password_reset', 'custom_redirect_after_password_reset');



//Disabling button

function disable_button_on_click() {
    ?>
    <script type="text/javascript">
        document.addEventListener('DOMContentLoaded', function () {
            var form = document.querySelector('form');
            var button = document.getElementById('wp-submit'); 

            if (form && button) {
                form.addEventListener('submit', function () {
                    
                    button.disabled = true;
                    button.value = "Chargement..."; 
                });
            }
        });
    </script>
    <?php
}

add_action('after_setup_theme', function() {
    load_theme_textdomain('movedo', get_template_directory() . '/languages');
});


/* AJOUT ROLE */
add_action( 'woocommerce_payment_complete', 'jo_add_role_after_purchase' );

function jo_add_role_after_purchase( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return;
    }

    $user_id = $order->get_user_id();
    if ( ! $user_id ) {
        return;
    }

    $user = get_user_by( 'id', $user_id );
    if ( ! $user ) {
        return;
    }

    // Ajoute un rôle supplémentaire (sans retirer les autres)
    $user->add_role( 'user_2026' );

}










// Ajouter le champ Numéro de TVA au checkout
add_filter( 'woocommerce_checkout_fields', 'ajouter_champ_tva_checkout' );
function ajouter_champ_tva_checkout( $fields ) {
    $fields['billing']['billing_vat_number'] = array(
        'type'        => 'text',
        'label'       => __('Numéro de TVA', 'text-domain'),
        'placeholder' => __('Entrez votre numéro de TVA', 'text-domain'),
        'required'    => false, 
        'class'       => array('form-row-wide'),
        'priority'    => 25,
    );
    return $fields;
}


add_action( 'woocommerce_checkout_update_order_meta', 'enregistrer_champ_tva_checkout' );
function enregistrer_champ_tva_checkout( $order_id ) {
    if ( ! empty( $_POST['billing_vat_number'] ) ) {
        update_post_meta( $order_id, '_billing_vat_number', sanitize_text_field( $_POST['billing_vat_number'] ) );
    }
}


add_action( 'woocommerce_admin_order_data_after_billing_address', 'afficher_tva_admin_commande', 10, 1 );
function afficher_tva_admin_commande( $order ) {
    $vat_number = get_post_meta( $order->get_id(), '_billing_vat_number', true );
    if ( $vat_number ) {
        echo '<p><strong>' . __( 'Numéro de TVA' ) . ':</strong> ' . esc_html( $vat_number ) . '</p>';
    }
}

add_action( 'wpo_wcpdf_after_billing_address', 'ajouter_numero_tva_facture_pdf', 10, 2 );
function ajouter_numero_tva_facture_pdf( $document_type, $order ) {

    if ( is_a( $order, 'WC_Order' ) ) {
      
        $vat_number = $order->get_meta('_billing_vat_number');

        if ( ! empty( $vat_number ) ) {
            ?>
            <p>
                <strong><?php _e( 'Numéro de TVA', 'text-domain' ); ?>:</strong>
                <?php echo esc_html( $vat_number ); ?>
            </p>
            <?php
        }
    }
}


add_filter('woocommerce_checkout_fields', 'custom_translate_vat_checkout_label');

function custom_translate_vat_checkout_label($fields) {
    if (function_exists('pll_current_language')) {
        $lang = pll_current_language();
    } else {
        $lang = 'fr';
    }

    // ⚠️ Assure-toi que l'ID du champ est bien 'billing_vat_number'
    if (isset($fields['billing']['billing_vat_number'])) {
        if ($lang === 'fr') {
            $fields['billing']['billing_vat_number']['label'] = 'Numéro de TVA';
        } elseif ($lang === 'nl') {
            $fields['billing']['billing_vat_number']['label'] = 'BTW-nummer';
        }
    }

    return $fields;
}




/* PERMET D4AJOUTER LES PRODUITS DANS LES 2 LANGUES */ 

add_filter('woocommerce_json_search_found_products', 'show_all_languages_products', 10, 1);
function show_all_languages_products($products) {
    if (function_exists('pll_get_post')) {
        $all_products = [];
        foreach ($products as $id => $title) {
            $translations = pll_get_post_translations($id);
            foreach ($translations as $lang => $translated_id) {
                $all_products[$translated_id] = get_the_title($translated_id);
            }
        }
        return $all_products;
    }
    return $products;
}

/* Modifs langue checkout */
add_action('wp_footer', 'custom_translate_payment_heading_js');

function custom_translate_payment_heading_js() {
    if (!function_exists('pll_current_language')) return;

    $lang = pll_current_language();

    ?>
    <script>
    document.addEventListener('DOMContentLoaded', function() {
        var heading = document.getElementById('order_review_heading');
        if (heading) {
            <?php if ($lang === 'fr'): ?>
                heading.textContent = 'Méthode de paiement';
            <?php elseif ($lang === 'nl'): ?>
                heading.textContent = 'Betaalmethode';
            <?php endif; ?>
        }
    });
    </script>
    <?php
}



add_filter('woocommerce_order_button_text', 'custom_translate_place_order_button');

function custom_translate_place_order_button($button_text) {
    if (function_exists('pll_current_language')) {
        $lang = pll_current_language();
    } else {
        $lang = 'fr';
    }

    if ($lang === 'fr') {
        $button_text = 'Commander';
    } elseif ($lang === 'nl') {
        $button_text = 'Bestellen';
    }

    return $button_text;
}



/* TRADUCTION DEUXIEME ADRESSE */

add_filter( 'gettext', function ( $translated, $text, $domain ) {

    if ( $domain === 'woocommerce' && $text === 'Ship the calendar to a different address?' ) {

        $loc = determine_locale();

        if ( in_array( $loc, [ 'fr_FR', 'fr_BE', 'fr_CA' ], true ) || str_starts_with( $loc, 'fr' ) ) {
            return 'Envoyer l’agenda à une autre adresse ?';
        }

        if ( in_array( $loc, [ 'nl_NL', 'nl_BE' ], true ) || str_starts_with( $loc, 'nl' ) ) {
            return 'De agenda naar een ander adres verzenden?';
        }
    }

    return $translated;

}, 20, 3 );



/* TRADUCTION CAPTCHA */ 
add_filter( 'gettext', function ( $translated, $text, $domain ) {

    $targets = [
        'Please complete the reCAPTCHA to verify that you are not a robot.',
        'Please complete the reCAPTCHA to prove you are not a robot.',
        'Please verify that you are not a robot.',
        'Please check the reCAPTCHA box to prove you are not a robot.',
    ];

    if ( in_array( $text, $targets, true ) ) {

        $loc = determine_locale();

        if ( in_array( $loc, [ 'fr_FR', 'fr_BE', 'fr_CA' ], true ) || str_starts_with( $loc, 'fr' ) ) {
            return 'Veuillez compléter le reCAPTCHA afin de vérifier que vous n’êtes pas un robot.';
        }

        if ( in_array( $loc, [ 'nl_NL', 'nl_BE' ], true ) || str_starts_with( $loc, 'nl' ) ) {
            return 'Vul de reCAPTCHA in om te controleren of u geen robot bent.';
        }
    }

    return $translated;

}, 20, 3 );


/* COCHER LA CASE NEWSLETTER */ 

add_action( 'wp_footer', function () {
    if ( is_checkout() ) : ?>
        <script>
            document.addEventListener('DOMContentLoaded', function () {
                const checkbox = document.getElementById('mailchimp_woocommerce_newsletter');
                if (checkbox && !checkbox.checked) {
                    checkbox.checked = true;
                }
            });
        </script>
    <?php endif;
});

/* CONFIDENTIALITÉ NL */ 

add_filter( 'woocommerce_get_privacy_policy_text', function( $text ) {

    $loc = determine_locale();

    // NL uniquement
    if ( in_array( $loc, [ 'nl_NL', 'nl_BE' ], true ) || str_starts_with( $loc, 'nl' ) ) {

        $url  = 'https://www.job-otb.be/nl/privacybeleid/'; //
        $link = '<a href="' . esc_url( $url ) . '" class="woocommerce-privacy-policy-link" target="_blank">privacybeleid</a>';

        $text = str_replace( '[privacy_beleid]', $link, $text );
    }

    return $text;

}, 20 );



/* ARRETER LE RENOUVELLEMENT */ 


add_action('wp_insert_comment', function ($comment_id, $comment) {
    if (empty($comment) || ($comment->comment_type ?? '') !== 'order_note') {
        return;
    }

    $content = (string) ($comment->comment_content ?? '');
    if ($content === '') {
        return;
    }

    $is_token_missing = (stripos($content, 'payment token not found for subscription renewal failed') !== false);
    $is_renewal_link  = (stripos($content, 'This renewal order belongs to Subscription #') !== false);

    if (!$is_token_missing && !$is_renewal_link) {
        return;
    }

    $order_id = (int) ($comment->comment_post_ID ?? 0);
    if ($order_id <= 0) {
        return;
    }

    if (!function_exists('wc_get_order')) {
        return;
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

 
    $status = $order->get_status(); // e.g. 'pending'
    if (!in_array($status, array('pending', 'on-hold', 'failed'), true)) {
        return;
    }

    $order->update_status(
        'cancelled',
        'Auto-cancel: renewal order created without payment token (preventing pending renewal orders).',
        true
    );

    if (function_exists('as_unschedule_all_actions')) {
        as_unschedule_all_actions(null, array('order_id' => $order_id));
        as_unschedule_all_actions(null, array('subscription_renewal_order_id' => $order_id));
    }
}, 10, 2);


/* TRADUCTION VIREMENT BANCAIRE

add_filter( 'woocommerce_gateway_description', function( $description, $gateway_id ) {

    if ( $gateway_id !== 'bacs' ) {
        return $description;
    }

    $loc = determine_locale();

    // Français
    if ( in_array( $loc, [ 'fr_FR', 'fr_BE', 'fr_CA' ], true ) || str_starts_with( $loc, 'fr' ) ) {
        return '<p>Merci d’effectuer votre paiement par virement bancaire sur notre compte. Veuillez indiquer votre numéro de commande en communication du virement afin que nous puissions identifier votre paiement. Votre commande sera terminée dès que le montant aura été reçu sur notre compte.</p>';
    }

    // Néerlandais
    if ( in_array( $loc, [ 'nl_NL', 'nl_BE' ], true ) || str_starts_with( $loc, 'nl' ) ) {
        return '<p>Gelieve uw betaling via overschrijving op onze rekening te verrichten. Vermeld uw bestelnummer in de mededeling van de overschrijving, zodat wij uw betaling kunnen identificeren. Uw bestelling wordt voltooid zodra het bedrag op onze rekening is bijgeschreven.</p>';
    }

    return $description;

}, 20, 2 );
 */