Modificare l'intestazione delle email WooCommerce utilizzando un plugin personalizzato

9 nov 2017, 14:14:51
Visualizzazioni: 15.6K
Voti: 1

Voglio cambiare il template dell'intestazione delle email woocommerce con uno nuovo per poter aggiungere condizioni nel template dell'intestazione e ottenere valori dalla dashboard (per cambiare il colore dell'intestazione in base all'input dell'utente dalla dashboard). Ho creato un file plugin per farlo.

Ho seguito diversi tutorial e tutto ciò che ho ottenuto sono una serie di errori. Ho una classe con il seguente codice:

public function __construct(){
    add_action('woocommerce_email',array($this,'woocommerce_email'));
}

Ora ho aggiunto il codice per rimuovere l'hook dell'intestazione predefinita

public function woocommerce_email($mailer){

    remove_action('woocommerce_header',array($mailer,'email_header'));
    add_action('woocommerce_header',array($this,'email_header'));

ora chiamo il template

public function email_header() {          
    wc_get_template( 'emails/email-header.php');
}

Non sto passando nulla al file template. Quindi nessun parametro viene passato alle funzioni. Volevo solo vedere che il mio template venisse preso. Inoltre, presumo che $mailer sia parte della classe woocommerce. Qualsiasi aiuto sarebbe apprezzato.

Si prega di notare che questa è una funzionalità del plugin quindi non sono interessato a sostituire i template delle email woocommerce.

4
Commenti

non è necessario scollegare / ricollegare. basta creare un file nella directory del tuo tema in woocommerce/emails/email-header.php e l'invio originale dell'email lo utilizzerà

mmm mmm
9 nov 2017 15:10:10

Ma sto cercando di creare un plugin. Non uno sviluppo di tema. Questo plugin è utilizzato per tutti i temi. Quindi invece di prendere i template email dal plugin woocommerce, deve prendere i template personalizzati creati nella directory del mio plugin

melvin melvin
9 nov 2017 18:45:46

Allora nel metodo email_header della tua classe, mostra semplicemente il file del tuo plugin, con require ad esempio

mmm mmm
9 nov 2017 19:18:17

non funziona

melvin melvin
9 nov 2017 19:44:49
Tutte le risposte alla domanda 2
14

Devi rimuovere l'azione woocommerce_email_header

remove_action( 'woocommerce_email_header', 'email_header');

Che è stata registrata in

wp-content\plugins\woocommerce\includes\class-wc-emails.php

Poi aggiungi la tua azione personalizzata

add_action('woocommerce_email_header','nome_tua_funzione');

La tua funzione deve generare output HTML

Di default c'è il seguente codice nel template dell'header

<?php
/**
 * Intestazione Email
 *
 * Questo template può essere sovrascritto copiandolo in yourtheme/woocommerce/emails/email-header.php.
 *
 * TUTTAVIA, occasionalmente WooCommerce avrà bisogno di aggiornare i file template e tu
 * (lo sviluppatore del tema) dovrai copiare i nuovi file nel tuo tema per
 * mantenere la compatibilità. Cerchiamo di farlo il meno possibile, ma a volte
 * è necessario. Quando ciò accade, la versione del file template verrà incrementata
 * e il readme elencherà i cambiamenti importanti.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @author  WooThemes
 * @package WooCommerce/Templates/Emails
 * @version 2.4.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=<?php bloginfo( 'charset' ); ?>" />
        <title><?php echo get_bloginfo( 'name', 'display' ); ?></title>
    </head>
    <body <?php echo is_rtl() ? 'rightmargin' : 'leftmargin'; ?>="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
        <div id="wrapper" dir="<?php echo is_rtl() ? 'rtl' : 'ltr'?>">
            <table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
                <tr>
                    <td align="center" valign="top">
                        <div id="template_header_image">
                            <?php
                                if ( $img = get_option( 'woocommerce_email_header_image' ) ) {
                                    echo '<p style="margin-top:0;"><img src="' . esc_url( $img ) . '" alt="' . get_bloginfo( 'name', 'display' ) . '" /></p>';
                                }
                            ?>
                        </div>
                        <table border="0" cellpadding="0" cellspacing="0" width="600" id="template_container">
                            <tr>
                                <td align="center" valign="top">
                                    <!-- Header -->
                                    <table border="0" cellpadding="0" cellspacing="0" width="600" id="template_header">
                                        <tr>
                                            <td id="header_wrapper">
                                                <h1><?php echo $email_heading; ?></h1>
                                            </td>
                                        </tr>
                                    </table>
                                    <!-- End Header -->
                                </td>
                            </tr>
                            <tr>
                                <td align="center" valign="top">
                                    <!-- Body -->
                                    <table border="0" cellpadding="0" cellspacing="0" width="600" id="template_body">
                                        <tr>
                                            <td valign="top" id="body_content">
                                                <!-- Content -->
                                                <table border="0" cellpadding="20" cellspacing="0" width="100%">
                                                    <tr>
                                                        <td valign="top">
                                                            <div id="body_content_inner">
10 nov 2017 07:56:38
Commenti

Ma questo non mi mostra il nuovo contenuto.

melvin melvin
10 nov 2017 08:22:03

la tua funzione dovrebbe generare del codice

Malay Solanki Malay Solanki
10 nov 2017 08:35:54

Continua a prendere l'header predefinito di WooCommerce

melvin melvin
10 nov 2017 08:36:29

dove scrivi il codice? Nel tema?

Malay Solanki Malay Solanki
10 nov 2017 08:38:27

file del plugin. Ho creato un file di plugin

melvin melvin
10 nov 2017 09:00:07

dovrebbe funzionare allora

Malay Solanki Malay Solanki
10 nov 2017 09:05:18

Il codice sembra ottimo. Lasciami controllare di nuovo il mio codice.

melvin melvin
10 nov 2017 09:20:48

Se il mio file template dell'intestazione email non contiene nulla tranne un echo, WooCommerce prenderà quello predefinito? @malaysolanki

melvin melvin
10 nov 2017 09:37:36

sì, dovrebbe funzionare

Malay Solanki Malay Solanki
10 nov 2017 10:08:11

Grazie fratello. Funziona. C'era un errore nel nome del mio action hook. Saluti @Malaysolanki

melvin melvin
10 nov 2017 11:07:22

Sai perché l'immagine non viene mostrata nell'intestazione dell'email? Il tag img è visibile quando si ispeziona con il browser

melvin melvin
16 nov 2017 14:42:18

Imposta un'altezza e larghezza fissa inline

Malay Solanki Malay Solanki
17 nov 2017 06:31:19

Fammi provare e ti farò sapere. Sei il miglior aiutante. Grazie per la tua mentalità d'aiuto @Malay

melvin melvin
20 nov 2017 05:55:16

Funziona. Grazie mille. Dato che ho una bassa reputazione, non posso segnare questa risposta. Lo farò quando avrò reputazione sufficiente per farlo @malaysolanki

melvin melvin
20 nov 2017 13:06:32
Mostra i restanti 9 commenti
0

Per chi esegue questa operazione dal proprio tema.

  1. Copia il contenuto del modello email che puoi trovare qui:

https://github.com/woocommerce/woocommerce/blob/master/templates/emails/email-header.php

  1. Incolla il contenuto del file del punto 1 nel seguente percorso

tuotema/woocommerce/emails/email-header.php

  1. Opzionale se hai bisogno dell'oggetto ordine per ottenere un dato devi aggiungere quanto segue nel tuo functions.php
    add_action( 'woocommerce_email_header', 'email_header_before', 1, 2 );
    function email_header_before( $email_heading, $email ){
        $GLOBALS['email'] = $email;
    }
  1. Opzionale, e poi nel file template che hai appena creato usalo in questo modo
// Chiama l'oggetto globale WC_Email
global $email;

// Ottieni un'istanza dell'oggetto WC_Order
$order = $email->object;

I passaggi 3 e 4, ottenuti da questa risposta

https://stackoverflow.com/questions/49739353/get-the-order-object-in-woocommerce-email-header-template

di @LoicTheAztec

19 giu 2020 00:36:23