För denna handledning kommer vi att gå igenom de steg som är inblandade för att integrera PayPal som din Betaltjänstleverantör för en WordPress-driven webbplats. Med hjälp av anpassade inläggstyper skapar vi en grundläggande kundvagn och tillåter betalningar att tas via PayPal. Medan det fungerade exemplet är funktionellt bör du vidta ytterligare åtgärder för att sanera och lagra data när du arbetar med betalningar.
Vi använder anpassade WP-Admin-sidor för visning av beställningar, anpassade posttyper för produktskapande (Jeffrey Way CPT-klass) och anpassade sidmallar för visning av produkter, kundvagn och bearbetning. Vår råfunktion kommer att skapas i PHP och vi kommer att tillämpa lite grundläggande styling med CSS.
Inom kodsekvenserna nedanför vissa markeringar kan ha tagits bort för läsbarhet.
För dem som väljer in här vänligen skicka för att hämta $ 200 eller hoppa över till steg 2 i denna handledning och dra nytta av provdata.
Låt oss publicera sidorna i WP-Admin som vi kommer att använda under hela handledningen.
Vi kommer att besöka dessa sidor igen och ange en anpassad mall till var och en senare.
Nu ska vi skapa kataloger och filer som krävs för vårt projekt.
Vi gör ett barntema från tjugo tio här, vi behöver bara skapa de filer vi kommer att ändra eller skapa från början. Alla andra som krävs t.ex.. footer.php WordPress fyller i ämnena för oss.
Vi kommer att arbeta med Jeffrey Way klass (kräver PHP 5.3) för att skapa en produkt anpassad posttyp
vilket möjliggör skapandet av produkter, och inte blogginlägg som låtsas vara produkter via WP-Admin.
I filen /wppp/wppp/post_types.php lägg till följande bitar av kod.
Först kommer vi att inkludera klassen.
innefattar ( 'jw_custom_posts.php');
För det andra, skapa en ny anpassad posttyp och identifiera vilka komponenter på skrivsidan som ska användas.
$ product = new JW_Post_type ('Product', array ('support' => array ('titel', 'redaktör', 'utdrag', 'miniatyrbild', 'kommentarer')));
För det tredje har vi ett specifikt fält som är bättre anpassat till ett textfält i sig. Pris.
$ product-> add_meta_box ('Produktinfo', array ('Price' => 'text'));
När allt tillsammans kommer det att se ut så här.
innefattar ( 'jw_custom_posts.php'); $ product = new JW_Post_type ('Product', array ('support' => array ('titel', 'redaktör', 'utdrag', 'miniatyrbild', 'kommentarer'))); $ product-> add_meta_box ('Produktinfo', array ('Price' => 'text'));
WordPress Custom Posttyper är fantastiska och med Jeffres klassimplementering kan det vara snabbt. De anpassade uppgifterna kan nås väldigt snabbt, ungefär som om du skulle blogginlägg inom "loop".
Låt oss besöka wppp / tpl-products.php fil och hämta produkterna.
// Mallnamn: Produkter
Detta är en konvention som WordPress kräver av oss att skapa en anpassad mall. Under förutsättning att det aktiva temat håller den här filen kan vi tilldela den till vilken sida som helst.
Gå vidare och tilldela denna mall till produktsidan som tidigare publicerats.
$ products = new WP_Query (array ('post_type' => 'produkt'));
Nästa skapar vi en ny instans av WP_Query
och leta efter
en posttyp av "produkt".
Använder sig av WP_Query
Vi har tillgång till många mallkoder som finns inom WordPress.
Allt som krävs nu är att slinga över produkterna och mata ut data.
medan ($ products-> have_posts ()): $ products-> the_post (); titeln(); eko "Pris: '; echo get_post_meta ($ post-> ID, 'product_info_price', true); eko "
'; the_post_thumbnail ( 'produkt'); the_excerpt (); EndWhile;
get_post_meta ();
kommer att hämta data som lagrats i anpassade fält och eftersom en metakassa lagts till med JWs klass tidigare är det här att använda för att hämta sitt värde.
Observera att vi använder "product_info_price" som den andra parametern för get_post_meta
. Det här namnet är tillämpat på vårt anpassade fält när du använder JW: s CPT-klass. Konventionen verkar vara name-of-post-type_info_field
.
WordPress kommer att tjäna single-custom-post-type.php om det finns en anpassad posttyp och en fil single-custom-post-name.php finns inom det aktiva temat. Det här är till hjälp när du skapar en ny mall för enskilda produkter.
Mycket som att hämta multiplar som vi skulle kunna använda WP_Query
(för anpassade frågor) och malltaggarna WordPress tillhandahåller. Men när vi tittar på ett enda objekt behöver vi inte längre en slinga eller en anpassning WP_Query
.
stolpen(); the_post_thumbnail ( 'produkt'); titeln(); echo get_post_meta ($ post-> ID, 'product_info_price', true); innehållet();
Ett tillägg till vårt enkel product.php fil, ett formulär som låter denna vara läggas till i kundvagnen.
Två dolda fält har lagts till i denna blankett, 1 som lagrar post-ID (eller produkt-ID) och den andra kommer att användas lite senare. En standardmängd av 1 är också inställd.
Knappen "Lägg till i kundvagnen" finns på produktsidan enligt bilden i det föregående steget, efter att en användare har valt att lägga till en produkt skickas formuläret till varukorgen.
Låt oss arbeta med wppp / tpl-cart.php filen nu.
/ * TEMPLATE NAME: Varukorg * /
tpl-cart.php är en anpassad mall så vi måste låta WordPress veta och tilldela mallen till vagnsidan via WP-Admin.
om ($ _ POST ['wppp_product_id']): $ product_id = $ _POST ['wppp_product_id']; $ qty = $ _POST ['wppp_qty']; $ action = $ _POST ['wppp_action']; switch ($ action) fall "lägg till": $ _SESSION ['cart'] [$ product_id] = $ _SESSION ['cart'] [$ product_id] + $ qty; ha sönder; fallet "tomt": unset ($ _ SESSION ['cart']); ha sönder; fall "remove": unset ($ _ SESSION ['cart'] [$ product_id]); ha sönder; endif;
Nu kontrollerar vi om lämpliga postdata har skickats och, om det är sant, lagras data för bekvämlighet som variabler.
Använd en omkopplare för att bestämma aktuell åtgärd och bearbeta därefter.
foreach ($ _ SESSION ['cart'] som $ product => $ qty): $ row = get_post ($ produkt); echo $ row-> postnamn echo $ row-> post_title; echo get_post_meta ($ produkt, "product_info_price", true); echo $ qty; echo number_format (get_post_meta ($ produkt, 'product_info_price', true) * $ qty, 2); endforeach;
För att skriva ut vagnen till sidan används en slinga för att iterera över sessionsdata.
Medan vi i denna krets frågar vi om mänskliga läsbara data istället för den numeriska representationen av varje produkt / post som lagras i sessionen.
Att göra detta get_post ()
är perfekt vilket möjliggör ett snabbt sätt att fråga WordPress genom att skicka ett post-ID. Den returnerade data är en nedskalad version av WP_Query
och det lagras inom $ rad
.
$ rad
kan nu skrivas ut till sidan tillsammans med en löpande summa som visar priset på produkten multiplicerat med kvantiteten.
Inom slingan placeras en blankett som för att underlätta för användaren kan ta bort en vara helt från sin vagn.
Med hjälp av den tidigare skrivna omkopplaren kan en kontroll för fallet "ta bort" låta objektet tas bort från sessionen.
PayPal erbjuder ett antal sätt att skicka och hämta data, vi använder Instant Payment Notification eller IPN.
För att PayPal ska kunna beräkna och bearbeta transaktioner kan data skickas med ett formulär med fält som matchar namngivna och förväntade datakonventioner enligt PayPal.
IPN-guiden finns i rubriken eller sidfoten på paypal.com/ipn.
Låt oss gå vidare ... inom tpl-cart.php, Under alla en form läggs till med de nakna nödvändiga PayPal-kraven.
Kolla in developer.paypal.com för en sandlåda och testmiljö.
När du är inloggad på ditt utvecklarkonto kan du skapa testköpare och säljarkonton och "Skriv in sandbox-testplats".
Skickar vagnen till "https://www.sandbox.paypal.com/cgi-bin/webscr
"tillåter användning av testmiljön.
Om du bestämmer dig för att gå live, kommer URL-adressen för formuläråtgärden helt enkelt att ändras till "https://www.paypal.com/cgi-bin/webscr
".
developer.paypal.com
kan vara en buggy och en långsam erfarenhet, ha tålamod. Skriva denna handledning Jag var tvungen att vänta på att PayPal skulle fixa sig och återvända ett par timmar senare.
$ qty):?>
Liksom den föregående sessionslocket hämtas data och presenteras med en kombination av raw PHP och en WordPress-funktion.
Förutsatt att du skickar PayPal den korrekta typen av data kommer den att behandlas via IPN.
I formuläret ovanstående produktnamn skickas alla relaterade kvantiteter och priser för varje produkt. PayPal kommer att utföra beräkningen den här gången för multiplar baserat på pris per artikel och kvantitet.
"Transaktions- och anmälningsvariabler" som beskrivs i IPN Guide har implementerats som dolda formulärfält som de andra variabla typerna som riktas av PayPal.
Genom att skicka ett e-postmeddelande till inmatningen med ett namn "företag" instrueras PayPal vilket konto är säljaren. Därför använder vi den nuvarande WordPress-administratörens e-postadress.
företag - E-postadress eller konto-ID för betalningsmottagaren (det vill säga
handlare). Motsvarar värdena på receiver_email (om betalningen är
skickas till primärkonto) och företag som anges i webbplatsbetalningen
html.
- IPN Guide -
De tre webbadresserna skickades med formuläret (lämna tillbaka
, cancel_return
och notify_url
) tillåter att länkar placeras i kassan som användare besöker paypal.com från kundvagnen. "annullera
"URL kommer att visas före och under transaktionen medan"lämna tillbaka
"visas efter transaktionen.
Du kan säga det viktigaste fältet här är "notify_url
"som tillåter en utvecklare att lyssna på PayPal-instruktioner bakom kulisserna när användaren behandlar sin transaktion.
När PayPal skickar ett svar till ipn.php fil transaktionen detaljer kan lagras i en databas, e-postmeddelanden kan skickas och nedladdningar presenteras. Det är upp till dig att bearbeta data med hjälp av metoder som speglar produkttypen till salu.
Så låt oss skapa databastabellen i ipn.php fil och flytta till hämtningsorder.
För genomförandegraden ett långtextfält för items_ordered
är skapad för att lagra de inköpta varorna med varje order och kvantiteten som serialiserad data. Det kan vara tillrådligt med en levande butik att normalisera alla databas tabeller bakom din butik till 4NF eller överväga att använda en anpassad posttyp när du lagrar beställningar.
Nu ska du kunna publicera nya produkter, lägga till en produkt (er) i kundvagnen, visa kundvagnen och fortsätt till PayPal.
När en kund har betalat för varor på PayPal, vad då? Hur kan vi identifiera om transaktionen har blivit framgångsrik, vilka varor har köpts och var ska de skickas?
I steg 8 utmärkses köparen och säljarkonton för provköp.
Även tidigare "return_url
"skapades som ett doldt formulärfält inom tpl-cart.php, den här filen kan användas om användaren skulle välja att "återgå till handelsplats" efter transaktionen vid PayPal.
Looping över postdata visar vad som händer.
foreach ($ _ POST som $ key => $ värde): echo 'Nyckel: '$ Nyckeln.'
'; eko "Värde: '$ Värde.'
'; endforeach;
Den här slingan kommer att skriva ut eventuell returinformation från PayPal via post. Du kan bestämma att använda detta för att lagra data, det är egentligen inte praktiskt att göra det.
För att komma fram till tacksidan hoppas vi att användaren kommer att klicka på "Återgå till försäljningswebbplats" från PayPal. Om en användare bestämmer sig för att stänga webbläsaren vad då?
På grund av detta fallfall allt som ska göras via tpl-thankyou.php är att tömma vagnen och visa innehållet som visas nedan.
/ * TEMPLATE NAME: Sida: Tack * / session_destroy (); stolpen(); titeln(); innehållet();
Vi meddelas då från PayPal, oavsett vad användaren väljer att göra efter betalning. Det här är var meddelandet "Instant Payment Notification" kommer in.
När formuläret ursprungligen skickades till PayPal "notify_url
"hade ett värde. Detta instruerade PayPal att vi skulle vilja använda filen http://yoursite.com/wp-content/themes/wppp/ipn.php för kommunikation.
Med detta i åtanke kan vi nu "lyssna" till PayPal (och inte användaren) för uppdateringar om betalningsstatus och process. Låt oss skapa den sista filen och namnge den ipn.php.
$ req = 'cmd = _notify-validate'; foreach ($ _ POST som $ key => $ värde): $ value = urlencode (stripslashes ($ value)); $ req. = "& $ key = $ value"; endforeach; $ header. = "POST / cgi-bin / webscr HTTP / 1.0 \ r \ n"; $ header. = "Innehållstyp: Application / x-www-form-urlencoded \ r \ n"; $ header. = "Innehållslängd:". strlen ($ req). "\ R \ n \ r \ n"; $ fp = fsockopen ('ssl: //www.sandbox.paypal.com', 443, $ errno, $ errstr, 30); om (! $ fp): // HTTP ERROR annars: fputs ($ fp, $ header. $ req); medan (! feof ($ fp)): $ res = fgets ($ fp, 1024); $ fh = fopen ('result.txt', 'w'); skriva ut ($ fh, $ res); fclose ($ fh); om (strcmp ($ res, "VERIFIED") == 0): // Se till att vi har tillgång till WP-funktioner, nämligen WPDB include_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ wp-load.php'); // Du bör validera mot dessa värden. $ firstName = $ _POST ['first_name']; $ lastName = $ _POST ['last_name']; $ payerEmail = $ _POST ['payer_email']; $ addressStreet = $ _POST ['address_street']; $ addressZip = $ _POST ['address_zip']; $ addressCity = $ _POST ['address_city']; $ productsBought = $ _POST ["]; $ txnID = $ _POST ['txn_id']; // Används för att lagra snabbt objekt som köpt $ i = 1; föreach ($ _ POST som $ key => $ värde): om == 'item_name'. $ i): $ products_bought [] = $ värde; $ i ++; endif; endforeach; $ products = serialize ($ products_bought); $ wpdb-> insert > $ firstName, 'surname' => $ lastName, 'email' => $ payerEmail, 'address_line_1' => $ adressStreet, 'postcode' => $ addressZip, 'town' => $ addressCity, 'items_ordered' => $ produkter, 'created' => current_time ('mysql'), 'txn_id' => $ txnID, 'user_ip' => $ _SERVER ['REMOTE_ADDR']), array ('% s', // FORENAME '% s' , // SURNAME '% s', // EMAIL '% s', // ADRESS 1 '% s', // PCODE '% s', // TOWN '% s', // ORDERED '% s' // STATUS '% s', // CREATED '% s' // USER IP)), elseif (strcmp ($ res, "INVALID") == 0): // Du kanske föredrar att lagra transaktionen även om det misslyckades för vidare undersökning. endif; endwhile; fclose ($ fp); endif;
Ovanstående kod ser lite skrämmande ut, du kan se hur den är pieced tillsammans genom att titta på den förenklade code-sample.php över på PayPal.
Utan att förklara det exempel som PayPal har givit som en guide lyssnar vi på Giltiga eller otillåtna svar och bearbetar därefter. WPDB används för att lagra all nödvändig data som returneras av PayPal.
foreach ($ _ POST som $ key => $ värde): om ($ key == 'item_name _'. $ i): $ products_bought [] = $ value; $ I ++; endif; endforeach;
Det här snippet löser över postdata och kontrollerar om det aktuella objektet är en item_name_x
som vi vet är vår produkts namn. Data serialiseras sedan och lagras i en array.
WPDB-insert-metoden används senare för att skicka den serialiserade data tillsammans med andra värden till kundens tabell.
Vårt sista steg innebär att man skapar en WP-Admin-menysida och fyller den sidan med de tidigare / lagrade data för kunder / order.
Du kan besluta att skapa en mer robust beställningssida för att tillåta pagination, markera varje föremål för frakt, lätt utskrift av fraktetiketter och allt annat.
Låt oss följa stilkonventionerna i WordPress och skapa en rimligt presenterad lång lista över beställningar.
definiera (ADMIN_URL, admin_url ()); // Helperfunktion wppp_orders () add_menu_page ('Orders', 'Orders', 'administrator', __FILE__, 'wppp_orders_page', ADMIN_URL.'images / generic.png ');
add_menu_page ()
exekveras med 6 parametrar av en möjlig 7.
En valfri parameter "menyposition" kunde passeras, men låt oss inte kämpa med andra författare.
funktion wppp_orders_page () ?>Order
Nedan visas en lista över alla beställningar.
# Förnamn Efternamn E-post Adress Köpta produkter Användare ip ID Förnamn Efternamn E-post Adress Köpta produkter Användare ip Ovan, en funktion skapas, och inom, en viss markering för att visa orderen. När du lägger till den nya menysidan passerade den här funktionen, som instruerar WordPress att utföra den här koden när man tittar på motsvarande menysida.
Använder sig av
wpdb
att utföra order kommer att vara det sista steget.funktion wppp_orders_page ()Order
Nedan visas en lista över alla beställningar.
# Förnamn Efternamn E-post Adress Köpta produkter Användare ip get_results ("SELECT * FROM customers"); ?> items_ordered); ?>id; ?> förnamn; ?> efternamn; ?> e-post; ?> address_line_1; ?>, postnummer; ?>, stad; ?> '$ produkter [$ i].''; EndFor; ?>
user_ip; ?> Inga beställningar än. Vid leverans av produkter och kvantiteter till databasen serierades data. Det är dags att vända det med
unserialize
vid varje iteration.En kapslad slinga tillåter varje rad oserialiserade data att delas och visas som listobjekt.
add_action ('admin_menu', 'wppp_orders');Slutligen exekveras de funktioner som skapats tidigare med hjälp av
add_action
funktion ochadmin_menu
åtgärd specifikt. För en fullständig förteckning över åtgärder, besök Action referens.
Slutsats
I denna handledning har en kombination av bästa metoder, hack och tekniker visat sig, varav många kommer att vara öppna för debatt. Någon kod och diskussion har utelämnats från handledningen, nämligen additional.css, och functions.php.
additional.css importeras i stilarket för tjugo tio (style.css) och tillämpar några grundläggande stilar för displayen i hela exemplet.
functions.php kräver några filer för anpassade inlägg och visningsorder inom WP-Admin. En ny bildstorlek är också inställd som grödar produktens miniatyrbild för att matcha.
Vi använder tjugo tio menyfunktioner för att visa toppmenylänkarna för "Produkter" och "Varukorg".
Låt oss veta i kommentarerna vad du tycker om denna introduktion till att använda PayPal med WordPress.