web-dev-qa-db-fra.com

Comment forcer Wordpress à changer temporairement de lieu?

J'ai un magasin multilingue utilisant WooCommerce et qTranslate, et j'essaie de configurer des courriels multilingues pour les clients. Le problème est que le courrier électronique "commande terminée" est envoyé à partir du backend de l'administrateur, et il est envoyé dans la langue dans laquelle le backend est utilisé, et non dans la langue dans laquelle la commande a été initialement passée.

Jusqu'ici, je travaille à stocker les paramètres régionaux de la commande en tant que champ personnalisé et à brancher mon code dans le mécanisme d'envoi de courrier électronique de WooCommerce. Ce que je dois faire maintenant est de basculer de manière dynamique les paramètres régionaux actuels sur ceux enregistrés dans les données de la commande, d'envoyer le courrier électronique et de le rétablir.

Actuellement, j'essaie de forcer la localisation dans une multitude d'endroits, mais aucun d'entre eux ne fonctionne. Voici le code actuel:

// get order language and its locale from qTranslate config
$order_custom_data = get_post_custom($order_id);
$new_locale = $order_custom_data['Customer Locale'][0];

// save current locale
$old_locale = get_locale();

// set the current locale and send email with it active
setlocale(LC_ALL, $new_locale);
global $q_config, $locale;
$locale = $new_locale;
$q_config['language'] = substr($new_locale, 0, 2);
// dispatch email
global $wc_cle_wc_email;
$wc_cle_wc_email->customer_processing_order($order_id);

// set the old locale back
$q_config['language'] = substr($old_locale, 0, 2);
$locale = $old_locale;
setlocale(LC_ALL, $old_locale);

La sortie de débogage montre que les paramètres régionaux en cours et en ordre sont lus correctement, et un appel get_locale() parallèle à customer_processing_order() génère les paramètres régionaux au lieu de ceux en cours. Mais le courrier électronique généré par l'appel customer_processing_order() est construit avec les chaînes de la langue actuelle au lieu de celles de la langue de la commande. Des idées comment travailler autour de ceci?

5
olex

Et je l'ai eu. Ce qui manquait, c'était de recharger le domaine de texte pour WooCommerce, chargé avec les paramètres régionaux en cours lors de l'initialisation:

// set the current locale and send email with it active
unload_textdomain('woocommerce');
setlocale(LC_ALL, $new_locale);
global $q_config, $locale, $woocommerce;
$locale = $new_locale;
$q_config['language'] = substr($new_locale, 0, 2);
$woocommerce->load_plugin_textdomain();

global $wc_cle_wc_email;
$wc_cle_wc_email->customer_completed_order($order_id);

// set the old locale back
unload_textdomain('woocommerce');
$q_config['language'] = substr($old_locale, 0, 2);
$locale = $old_locale;
setlocale(LC_ALL, $old_locale);
$woocommerce->load_plugin_textdomain();

Certains des appels établissant les variables de paramètres régionaux sont probablement redondants et/ou simplement inutiles, mais cela fonctionne.

5
olex

Ok, voici une réponse un peu plus complète pour ceux qui trébuchent plus tard.

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
         $fields['order']['language']['placeholder'] = '';
         $fields['order']['language']['type'] = 'text';
         $fields['order']['language']['label'] = 'language';
         $fields['order']['language']['class'] = array('hidden'); 
         $fields['order']['language']['default'] = qtrans_getLanguage();
     return $fields;
}

Et ensuite ... vous devez enregistrer ce champ à la caisse, ce qui est simple:

/**
 * Save the language to the order (despite what woocommerce doc says this is required)
 */
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['language'] ) ) {
        update_post_meta( $order_id, 'language', sanitize_text_field( $_POST['language'] ) );
    }
}

Et puis ... (cette partie est un peu compliquée, mais je raccroche au début de la création de l'e-mail (le sujet), puis change la langue dans la langue de la commande). Je ne pense pas que vous ayez vraiment besoin de vous soucier de le changer, car une fois le thread mort, il reviendra à la valeur par défaut. Et il devrait juste mourir juste après l'envoi de cet email car cela ne se produit que sur un rappel.

add_filter('woocommerce_email_subject_customer_completed_order', 'waspdigital_order_complete_language_fix', 1, 2);
function waspdigital_order_complete_language_fix( $subject, $order ){
    global $woocommerce;
    $new_locale = get_post_meta( $order->id, 'language', true);
    // set the current locale and send email with it active
    unload_textdomain('woocommerce');
    setlocale(LC_ALL, $new_locale);
    global $q_config, $locale, $woocommerce;
    $locale = $new_locale;
    $q_config['language'] = substr($new_locale, 0, 2);
    $woocommerce->load_plugin_textdomain();

/*
    // set the old locale back
    unload_textdomain('woocommerce');
    $q_config['language'] = substr($old_locale, 0, 2);
    $locale = $old_locale;
    setlocale(LC_ALL, $old_locale);
    $woocommerce->load_plugin_textdomain();
*/

    return $subject;
}
3
deweydb