WordPress și PayPal Introducere

Pentru acest tutorial vom trece prin pașii implicați pentru a integra PayPal ca furnizor de servicii de plată pentru un site web alimentat de WordPress. Lucrul cu tipurile personalizate de posturi vom crea un coș de cumpărături de bază și vom permite efectuarea plăților prin PayPal. În timp ce exemplul lucrat este funcțional, trebuie să luați măsuri suplimentare pentru a dezinstala și a stoca date atunci când lucrați cu plăți.


Introducere

Vom utiliza pagini personalizate WP-Admin pentru vizualizarea comenzilor, tipuri personalizate de posturi pentru crearea de produse (clasa CPT Jeffrey Way) și șabloane personalizate pentru vizualizarea produselor, cărucioarelor și procesării. Funcția noastră principală va fi creată în PHP și vom aplica un anumit stil de bază cu CSS.

În cadrul fragmentelor de cod de mai jos, este posibil ca unele marcări să fi fost eliminate pentru citire.

Pentru cei care optează aici, vă rugăm să avansați pentru a merge și a colecta 200 $ sau pentru a trece la etapa 2 a acestui tutorial și pentru a beneficia de date de eșantion.


Pasul 1 WP-Admin și Structura paginii

Să publicăm paginile din WP-Admin pe care le vom folosi pe parcursul tutorialului.

  1. Cart
  2. Produse
  3. Mulțumesc

Vom re-vizita aceste pagini și alocăm un șablon personalizat fiecăruia mai târziu.


Etapa 2 Structura temei pentru copii

Acum vom crea directoarele și fișierele necesare pentru proiectul nostru.

Facem o temă pentru copii de la Douăzeci și zece aici, avem nevoie doar de crearea fișierelor pe care le vom modifica sau crea de la zero. Orice altele care sunt necesare, de ex. footer.php WordPress va completa spațiile pentru noi.


Pasul 3 Tipurile personalizate de post ale lui Jeffrey Way

Vom lucra cu clasa lui Jeffrey Way (necesită PHP 5.3) pentru a crea un tip de post particularizat pentru produs
care va permite crearea de produse, și nu posturile de blog care pretind a fi produse, prin WP-Admin.

În dosar /wppp/wppp/post_types.php adăugați următoarele coduri.

Mai întâi vom include clasa.

includ ( 'jw_custom_posts.php');

În al doilea rând, creați un nou tip de postare personalizată și identificați ce componente ale paginii de scriere să o utilizați.

$ product = new JW_Post_type ('Produs', array ('suport' => array ('title', 'editor', 'extract', 'thumbnail', 'comments')));

În al treilea rând, avem un domeniu specific care este mai potrivit pentru un câmp text pe cont propriu. Preț.

$ product-> add_meta_box ('info produs', array ('Pret' => 'text'));

Când toți împreună vor arăta astfel.

includ ( 'jw_custom_posts.php'); $ product = new JW_Post_type ('Produs', array ('suport' => array ('title', 'editor', 'extract', 'thumbnail', 'comments'))); $ product-> add_meta_box ('info produs', array ('Pret' => 'text'));

Pasul 5 Preluarea tuturor produselor

WordPress personalizate tipuri de posturi sunt fantastice și cu implementarea clasei lui Jeffrey poate fi rapidă. Datele personalizate pot fi accesate foarte repede, la fel ca blogurile din cadrul "bucla".

Să vizităm wppp / tpl-products.php fișier și să preluați produsele.

// Nume de produs: Produse

Aceasta este o convenție WordPress cere de la noi pentru a crea un șablon personalizat. Cu condiția că tema activă deține acest fișier, îl putem atribui oricăror pagini.

Mergeți mai departe și alocați acest șablon paginii cu produse publicate anterior.

$ products = noul WP_Query (array ('post_type' => 'produs'));

Apoi vom crea o nouă instanță de WP_Query și căutați
un post_type de "produs".

Utilizarea WP_Query avem acces la multe etichete șablon existente în WordPress.

Tot ceea ce este necesar acum este de a buclat peste produse și de a ieși datele.

în timp ce ($ products-> have_posts ()): $ products-> the_post (); titlul(); echo "

Preț: „; echo get_post_meta ($ post-> ID, 'product_info_price', true); echo "

„; the_post_thumbnail ( 'produs'); the_excerpt (); endwhile;

get_post_meta (); va prelua datele stocate în câmpurile personalizate și, din moment ce o casetă meta a fost adăugată utilizând clasa JW, aceasta este ceea ce trebuie utilizat pentru a-și recupera valoarea.

Observați că folosim "product_info_price" ca al doilea parametru pentru get_post_meta. Acesta este numele aplicat câmpului nostru personalizat când se utilizează clasa CPT a lui JW. Convenția pare a fi nume-post-type_info_field.


Pasul 6 Preluarea unui produs unic

WordPress va servi o singură comandă post-type.php dacă există un tip de articol personalizat și un fișier o singură comandă post-name.php există în cadrul temei active. Acest lucru este util atunci când creați un nou șablon pentru produse unice.

La fel ca recuperarea multipli ne-am putea folosi WP_Query (pentru interogările personalizate) și etichetele de șabloane pe care le oferă WordPress. Cu toate acestea, atunci când vizualizăm un singur element, din punct de vedere tehnic, nu mai avem nevoie de o buclă sau de un obicei WP_Query.

bara(); the_post_thumbnail ( 'produs'); titlul(); echo get_post_meta ($ post-> ID, 'product_info_price', true); continutul();

Un plus față de noi single-product.php fișier, un formular care va permite adăugarea acestui element la sesiunea de coș de cumpărături.

Au fost adăugate două câmpuri ascunse în acest formular, unul care va stoca ID-ul postului (sau codul de produs), iar celălalt va fi utilizat puțin mai târziu. De asemenea, este setată o valoare implicită de 1.


Pasul 7 Adăugarea unui element la sesiune

Butonul "Adăugați în coș" se află pe pagina cu un singur produs, așa cum este ilustrat în pasul anterior, după ce un utilizator a ales să adauge un produs, formularul va fi trimis la pagina de coș.

Să lucrăm cu wppp / tpl-cart.php fișier acum.

/ * NUME TEMPLATĂ: Cart * /

TPL-cart.php este un șablon personalizat, astfel încât trebuie să lăsăm WordPress să știe și să atribui șablonul paginii de coș prin WP-Admin.

dacă ($ _ POST ['wppp_product_id']): $ product_id = $ _POST ['wppp_product_id']; $ qty = $ _POST ['wppp_qty']; $ action = $ _POST ['wppp_action']; comanda ($ action) caz "add": $ _SESSION ['cart'] [$ product_id] = $ _SESSION ['cart'] [$ product_id] + $ qty; pauză; cazul "gol": dezactivat ($ _ SESSION ['cart']); pauză; cazul "eliminați": dezactivat ($ _ SESSION ['cart'] [$ product_id]); pauză;  endif;

Acum, verificăm dacă au fost trimise date postate adecvate și, dacă este adevărat, stocăm datele pentru a fi utilizate ca variabile.

Folosind un comutator pentru a determina acțiunea curentă și a proceda în consecință.

foreach ($ _ SESSION ['cart'] ca $ product => $ qty): $ row = get_post ($ product); echo $ row-> post_name echo $ row-> post_title; echo get_post_meta ($ produs, 'product_info_price', true); echo $ qty; echo numărul_format (get_post_meta ($ product, 'product_info_price', true) * $ qty, 2); endforeach;

Pentru a imprima coșul pe pagină, se utilizează o buclă pentru a itera peste datele sesiunii.

În timp ce în această bucle se interoghează date citibile de către om în loc de reprezentarea numerică a fiecărui produs / post stocat în cadrul sesiunii.

Pentru a face acest lucru get_post () este perfectă, care permite o modalitate rapidă de a interoga WordPress prin transmiterea unui ID post. Datele returnate sunt o versiune redusă a WP_Query și este stocat în interior $ rând.

$ rând pot fi acum tipărite pe pagină împreună cu un total de execuție care arată prețul produsului înmulțit cu cantitatea.

În interiorul bucla este plasat un formular care, pentru comoditate, va permite unui utilizator să înlăture un articol în întregime din coșul său.

Folosind comutatorul scris anterior, o verificare a cazului de "eliminare" va permite eliminarea elementului din sesiune.


Pasul 8 Pregătirea pentru PayPal

PayPal oferă o serie de modalități de trimitere și recuperare a datelor, vom folosi notificarea de plată instantanee sau IPN.

  • Despre IPN
  • Testarea cu ghid IPN

Pentru ca PayPal să poată calcula și procesa orice tranzacție, datele pot fi trimise printr-un formular cu câmpuri care se potrivesc cu convențiile de denumire și de date așteptate stabilite de PayPal.
Ghidul IPN poate fi găsit în meniul antetului sau al subsolului de la paypal.com/ipn.

Să mergem mai departe ... înăuntru TPL-cart.php, sub orice formă, se adaugă cerințele esențiale de PayPal esențiale.

$ buc):?>

Check out developer.paypal.com pentru un mediu de testare și mediul de testare.

După ce v-ați conectat la contul dvs. de dezvoltator, veți putea crea conturi pentru cumpărători și vânzări de testare și "Introduceți site-ul de test pentru sandbox".

Trimiterea căruciorului la "https://www.sandbox.paypal.com/cgi-bin/webscr"va permite utilizarea mediului de testare.

Dacă vă decideți să intrați live, adresa URL a acțiunii de formular s-ar schimba pur și simplu la "https://www.paypal.com/cgi-bin/webscr".

developer.paypal.com poate fi un buggy și o experiență lentă, aveți răbdare. Scriind acest tutorial am avut de așteptat ca PayPal să se repare și să se întoarcă câteva ore mai târziu.

  $ buc):?>      

La fel ca bucla de sesiune anterioară, datele sunt preluate și prezentate împreună cu o combinație de funcții brute PHP și WordPress.

Cu condiția să trimiteți PayPal tipul corect de date, acesta va fi procesat prin IPN.

În formularul de mai sus, cantitățile și prețurile aferente fiecărui produs sunt trimise. PayPal va efectua calculul de această dată pentru multiplii pe baza prețului pe produs și cantitate.

        

"Variabilele de tranzacție și de notificare" descrise în Ghidul IPN au fost implementate ca câmpuri de formular ascunse la fel ca și celelalte tipuri de variabile reglate de PayPal.

Trimiterea unui e-mail la intrare cu numele de "afacere" instruiește PayPal care cont este vânzătorul. Aici, pentru comoditate, folosim e-mailul curent al administratorului WordPress.

afacere - adresa de e-mail sau ID-ul contului destinatarului plății (adică
comerciant). Echivalent cu valorile receiver_email (dacă plata este
trimis în contul principal) și afacerea stabilită în Plata site-ului web
HTML.
- Ghid IPN -

Cele 3 adrese URL trecute cu formularul (întoarcere, cancel_return și notify_url) permit ca linkurile să fie plasate în procesul de plată ca un utilizator care vizitează paypal.com din cărucior. ""Anulare"URL-ul va fi afișat înainte și în timpul tranzacției, în timp ce"întoarcere"este afișată după tranzacție.

Ați putea spune că cel mai important domeniu aici este "notify_url"care permite unui dezvoltator să asculte instrucțiunile PayPal în spatele scenei, pe măsură ce utilizatorul își procesează tranzacția.

Când PayPal trimite un răspuns la ipn.php fișierul detaliile tranzacției pot fi stocate într-o bază de date, e-mailurile pot fi trimise și descărcările prezentate. Depinde de dvs. să procesați datele utilizând metode care reflectă tipul de produs de vânzare.

Deci, să creăm tabelul bazei de date în ipn.php fișier și treceți la preluarea comenzilor.


Pasul 9 Baza de date

Pentru viteza de implementare un câmp longtext pentru lucruri comandate este creat pentru a stoca elementele achiziționate cu fiecare comandă și cantitatea ca date serializate. Ar putea fi recomandabil, cu un magazin live, să normalizați tabelele bazei de date aflate în spatele magazinului dvs. la 4NF sau să luați în considerare utilizarea unui tip de post particularizat atunci când stocați comenzi.


Pasul 10 Testarea

Acum ar trebui să puteți să publicați produse noi, să adăugați un produs (e) la sesiunea de coș, să vizualizați sesiunea de coș de cumpărături și să continuați cu PayPal.

După ce un client a plătit pentru bunuri la PayPal, atunci? Cum putem identifica dacă tranzacția a avut succes, care bunuri au fost cumpărate și unde ar trebui să fie expediate?

La pasul 8, conturile cumpărătorilor și vânzătorilor au fost evidențiate pentru achizițiile de test.

De asemenea, anterior "return_url"a fost creat ca un câmp de formă ascuns în interiorul TPL-cart.php, acest fișier ar putea fi utilizat dacă utilizatorul ar trebui să aleagă "Înapoi la site-ul comerciantului" după tranzacția la PayPal.

Împingerea datelor postare va arăta ce se întâmplă.

foreach ($ _ POST ca $ cheie => valoare $): echo '

Cheie: '$ Cheie.'

„; echo "

Valoare: '$ Valoare.'

„; endforeach;

Această buclă va tipări toate datele returnate din PayPal prin poștă. S-ar putea să decideți să utilizați acest lucru pentru stocarea datelor, nu este cu adevărat practic să faceți acest lucru.

Pentru a ajunge la pagina de mulțumire, sperăm că utilizatorul va da clic pe "Înapoi la site-ul comerciantului" de la PayPal. În cazul în care un utilizator decide să închidă browserul, atunci?

Din cauza acestei capcane, tot ce trebuie făcut prin intermediul TPL-thankyou.php este să goliți căruciorul și să afișați conținutul așa cum se arată mai jos.

/ * NUME TEMPLATE: Pagina: Vă mulțumim * / session_destroy (); bara(); titlul(); continutul();

Suntem apoi notificați de la PayPal indiferent de ce decide utilizatorul după efectuarea plății. Aici intră "Notificarea" Notificării de plată instantanee.

Când formularul a fost trimis inițial către PayPal "notify_url"a avut o valoare.Acesta a instruit PayPal că dorim să folosim fișierul http://yoursite.com/wp-content/themes/wppp/ipn.php pentru comunicare.

Având în vedere acest lucru, putem acum "asculta" PayPal (și nu utilizatorul) pentru actualizări privind starea și procesul de plată. Să creăm acel fișier final și să îl numim ipn.php.

$ req = 'cmd = _notify-validate'; foreach ($ _ POST ca $ cheie => valoare $): $ value = urlencode (stripslashes (valoare $)); $ req. = "& $ cheie = $ valoare"; endforeach; $ header = "POST / cgi-bin / webscr HTTP / 1.0 \ r \ n"; $ header = "Tip de conținut: aplicație / x-www-form-urlencoded \ r \ n"; $ header = "Content-Length:". strlen ($ req). "\ R \ n \ r \ n"; $ fp = fsockopen ('ssl: //www.sandbox.paypal.com', 443, $ errno, $ errstr, 30); dacă (! $ fp): // HTTP ERROR altfel: fputs ($ fp, $ header; $ req); în timp ce (! feof ($ fp)): $ res = fgets ($ fp, 1024); $ fh = fopen ('rezultat.txt', 'w'); fwrite ($ fh, $ res); fclose ($ fh); dacă (strcmp ($ res, "VERIFIED") == 0): // Asigurați-vă că avem acces la funcțiile WP și anume WPDB include_once ($ _ SERVER ['DOCUMENT_ROOT'] ./ wp-load.php '); // Trebuie să validezi aceste valori. $ firstName = $ _POST ['first_name']; $ lastName = $ _POST ['last_name']; $ payerEmail = $ _POST ['payer_email']; $ adresaStreet = $ _POST ['address_street']; $ adresaZip = $ _POST ['adresa_zip']; $ adresaCity = $ _POST ['address_city']; = $ _POST ["]; $ txnID = $ _POST ['txn_id']; // pentru stocarea rapidă a elementelor cumpărate $ i = 1; foreach ($ _ POST ca $ key => $ value) == 'item_name'. $ i): $ products_bought [] = $ value; $ i + > $ firstName, 'nume_name' => $ lastName, 'email' => $ payerEmail, 'address_line_1' => $ adresaStreet, 'postcode' => $ addressZip, 'town' => $ addressCity, 'items_ordered' => $ produse "create" => current_time ('mysql'), 'txn_id' => $ txnID, 'user_ip' => $ _SERVER ['REMOTE_ADDR']) , // EMAIL '% s', // ADRESA 1 '% s', // PCODE '% s', // TOWN '% s', // ORDERAT '% s', // STATUS '% s', // CREATED '% s' // USER IP)); elseif (strcmp ($ res, "INVALID") == 0): // Puteți prefera să stocați tranzacția chiar dacă nu a reușit pentru o investigație ulterioară, în final, în final, fclose ($ fp), endif;

Codul de mai sus arată un pic înfricoșător, puteți vedea cum este cuplat împreună prin analizarea codului simplificat sample.php la PayPal.

Fără a explica exemplul pe care PayPal l-a oferit ca ghid, ascultăm răspunsurile valide sau nevalide și procesând în consecință. WPDB este folosit pentru a stoca orice date solicitate returnate de PayPal.

foreach ($ _ POST ca $ cheie => valoare $): dacă ($ key == 'item_name _'. $ i): $ products_bought [] = $ value; $ I ++; endif; endforeach;

Acest fragment se leagă de datele postate și verifică dacă elementul curent este unul item_name_x pe care o cunoaștem este numele produsului nostru. Datele sunt apoi serializate și stocate într-un matrice.

Metoda inserării WPDB este folosită mai târziu pentru a trimite datele serializate împreună cu alte valori către tabelul clienților.


Pasul 12 Comenzi WP-Admin

Pasul nostru final constă în crearea unei pagini din meniul WP-Admin și al ocupării acelei pagini cu datele clienților / comenzilor stocate anterior.

Puteți decide să creați o pagină de comenzi mai robustă pentru a permite paginarea, marcarea fiecărui articol pentru expediere, imprimarea ușoară a etichetelor de transport maritim și orice altceva.

Să urmăm convențiile de stil ale WordPress și să creăm o listă lungă de comenzi bine prezentată.

definiți (ADMIN_URL, admin_url ()); // funcția Helper wppp_orders () add_menu_page ('Comenzi', 'Comenzi', 'administrator', __FILE__, 'wppp_orders_page', ADMIN_URL.'images / generic.png '); 

add_menu_page () este executată cu 6 parametri ai unui posibil 7.

  1. Titlul paginii
  2. Titlul meniului
  3. Rolul utilizatorului
  4. URL pentru pagina noastră de opțiuni. În locul competiției pentru rang, folosim locația și numele fișierului
  5. Funcție pentru a executa în timp ce accesați această pagină
  6. Pictogramă pentru meniu

Un parametru opțional "poziție de meniu" ar putea fi trecut, dar din nou să nu ne luptăm cu alți autori.

funcția wppp_orders_page () ?> 

Comenzi

Mai jos este o listă a tuturor comenzilor.

# Prenume Nume de familie E-mail Adresa Produse achiziționate User ip
ID-ul Prenume Nume de familie E-mail Adresa Produse achiziționate User ip

Mai sus, este creată o funcție și, în interiorul, o anumită marcare pentru afișarea ordinelor. Când adăugați noua pagină de meniu, această funcție a fost de asemenea transmisă, care instruiește WordPress să execute acest cod la vizualizarea paginii de meniu corespunzătoare.

Utilizarea wpdb pentru a scoate comenzile va fi etapa finală.

funcția wppp_orders_page ()  

Comenzi

Mai jos este o listă a tuturor comenzilor.

get_results ("SELECT * FROM clienți"); ?> lucruri comandate); ?>
# Prenume Nume de familie E-mail Adresa Produse achiziționate User ip
id; ?> prenume; ?> nume de familie; ?> e-mail; ?> Adresa Rândul 1; ?>, codul poștal; ?>, oraș; ?>
    '$ produse [$ i].'„; endfor; ?>
user_ip; ?>
Nu există încă comenzi.

La trimiterea produselor și cantităților în baza de date datele au fost serializate. Acum este momentul să inversați asta unserialize la fiecare iterație.

O buclă imbricată permite ca fiecare linie de date neserializate să fie divizată și afișată ca elemente de listă.

add_action ('admin_menu', 'wppp_orders');

În cele din urmă, funcțiile create anterior sunt executate utilizând ADD_ACTION și funcția admin_menu acțiune în mod specific. Pentru o listă completă a acțiunilor, vizitați referința Acțiune.


Concluzie

În acest tutorial s-a arătat o combinație de bune practici, hackeri și tehnici, dintre care multe vor fi deschise spre dezbatere. Unele coduri și discuții au fost omise din tutorial, și anume additional.css, și functions.php.

additional.css este importată în foaia de stil pentru douăzeci și zece (style.css) și aplică câteva stiluri de bază pentru afișare pe parcursul exemplului.

functions.php necesită fișiere pentru posturi personalizate și comenzi de vizualizare în cadrul WP-Admin. Este de asemenea stabilită o nouă dimensiune a imaginii care culminează miniatura de produs pentru a se potrivi.

Folosim meniul Twenty Ten pentru a afișa linkurile de meniu de sus pentru "Produse" și "Cart".

Spuneți-ne în comentariile dvs. ce credeți despre această introducere în utilizarea PayPal cu WordPress.

Cod