WordPress – Instalare Locală

Am articolul ăsta în draft de foarte mult timp, cred că peste un an. Ce m-a determinat să-l public a fost însă lansarea WordPress 3.7, versiune ce aduce – printre altele – și update-uri automate. Am văzut că mulți se plâng de acest lucru dintr-un motiv extrem de stupid: au fost făcute modificări în core-ul WP. Prin urmare m-am hotărât să public acest articol și, în plus, să scriu și despre câteva best practices în dezvoltarea de teme și plugin-uri pentru acest CMS.

Voi aborda un pic problema update-ului automat, că este cap de afiș pe foarte multe blog-uri.

Auto Core Update funcționează doar la versiunile minore. Asta înseamna că de la 3.7.0, cât este acum, se va face update automat la 3.7.1, 3.7.2 șamd. Când apare 3.8 NU se face update. În versiunea curentă NU se face update automat la plugin-uri sau la teme ci strict la fișierele din CORE. În momentul de față, singurul motiv pentru care cineva nu ar vrea activat auto-updater este că a făcut modificări în fișierele din Core, lucru profund greșit, având în vedere că, de-a lungul timpului, nu am avut nevoie niciodată de așa ceva (și s-a întâmplat să lucrez la site-uri destul de complexe).

Dacă vrei totuși să dezactivezi update-ul automat, este suficient să adaugi în wp-config.php următoarea linie:

define('DB_COLLATE', ''); // linia asta există deja
define( 'AUTOMATIC_UPDATER_DISABLED', true );

Dacă, din varii motive, vrei să dezactivezi update-ul doar din temă, este suficient să adaugi în functions.php

add_filter( 'auto_upgrader_disabled', '__return_true' );

În acest articol îți voi explica pașii ce trebuiesc făcuți pentru a avea un set-up de WordPress accesibil local.

Tot ce urmează pleacă de la premisa că ești fie pe Windows, fie pe OSX, că instalezi aplicațiile cu setările implicite și, cel mai important, ai cunoștințe de bază de HTML, CSS, PHP si MySQL. Dacă folosești Linux presupun că deja știi ce trebuie să faci și poți sări peste acest articol.

Prima problemă

Cea mai mare problemă la cei ce își dezvoltă singuri tema este că fac asta direct în producție (adică direct pe site-ul live).

De multe ori se mai întâmplă să uiți o virgulă, să nu pui o ghilimea bine iar site-ul crapă. În alte cazuri se poate întâmpla să vrei să folosești o funcție dar să-i scrii numele greșit și să nu observi când ești autentificat.

Prin urmare, ai nevoie de un server accesibil doar pe local, astfel încât toate experimentele și/sau greșelile sunt văzute doar de tine.

Prima soluție: XAMPP

XAMPP este o suită de aplicații ce conține cam tot ce este nevoie pentru dezvoltarea unui site bazat pe WordPress: un server Apache, un server MySQL și extensia PHP.

Instalarea este foarte simplă (next, next, next) iar configurarea are nevoie de câțiva pași suplimentari. Din XAMPP Control Panel (XCP) alegi Config->Apache (httpd.conf) și te asiguri că următoarele linii nu sunt comentate (adică nu au un # în față):

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule deflate_module modules/mod_deflate.so

După ce salvezi, tot din XCP alegi Config->PHP (php.ini) și la sfârșitul fișierului adaugi (dacă este cazul, ajustează calea c:\xampp\; de exemplu, pe Mac este /Applications/XAMPP/):

[XDebug]
zend_extension = "c:\xampp\php\ext\php_xdebug.dll"
xdebug.profiler_output_dir = "c:\xampp\tmp\profiler"
xdebug.profiler_output_name = "cachegrind.out.%t-%s"
xdebug.trace_output_dir = "c:\xampp\tmp\trace"
xdebug.profiler_enable_trigger = 1
display_errors = On

Este important să avem un cod curat ce nu generează nici un fel de eroare. Nu? :)

Este posibil ca Skype să fie în conflict cu Apache. Pentru a rezolva această problemă, asigură-te că această optiune nu este bifată

Salvezi iar, după care în XCP oprești Apache și îl pornești la loc. Dacă http://localhost este accesibil înseamnă că suntem gata de lucru.

Instalarea WordPress

La fel ca și pe serverul din producție, fișierele WP-ului se țin într-un director anume: C:\xampp\htdocs (sau /Applications/XAMPP/htdocs/).

Poți șterge liniștit toate fișierele existente și poți extrage conținutul arhivei în folderul mai sus menționat. În cazul în care ai nevoie de puțină organizare (foarte utilă dacă dezvolți mai mult de un site), poți extrage totul într-un folder nou: c:\xampp\htdocs\proiect-1.

Baza de date
Asigură-te că Database Collation este setat pe utf8_general_ci, altfel s-ar putea să existe anumite probleme cu diacriticele

XAMPP vine cu phpMyAdmin pentru management-ul bazelor de date MySQL și poate fi accesat la http://localhost/phpmyadmin. Acesta este relativ simplu de folosit pentru ce ai nevoie: Databases->Create Database.

După ce ai creat o bază de date, poți începe instalarea WordPress accesând http://localhost (sau, dacă ai extras arhiva WP într-un folder, http://localhost/nume_folder), introducând datele cerute:

  • Database Name: numele bazei de date de mai sus;
  • Database User: root;
  • Database Password: lași gol;
  • Database Host: localhost
  • Table Prefix: wp_
Clonarea bazei de date din producție

Ai grijă să nu încurci baza de date locală cu cea online!

De multe ori este util să ai un set de date real cu care poți lucra, mai ales dacă tema este destinată unui site existent. Pentru asta, deschizi același phpMyAdmin, dar, de această dată din CPanel-ul site-ului și, după ce alegi baza de date a site-ului din sidebar, apeși pe export.

După ce se descarcă fișierul, în phpMyAdmin de pe local, selectezi baza de date creeată mai devreme, selectezi toate tabelele și alegi drop. După ce ai șters tot, apeși pe butonul de Import, alegi fișierul descărcat anterior și apeși pe butonul Go.

Dacă importul a decurs fără probleme, tabelele șterse ar trebui să fi apărut la loc, cu (probabil) mici diferențe. Una din diferențe este că prefixul tabelelor poate fi diferit, astfel că în loc de wp_ să fie altceva.

Pentru a rezolva problema asta, edităm wp-config.php din directorul în care am instalat WP și facem următoarele schimbări:

$table_prefix  = 'prefix_';
define('WP_DEBUG', true); //câteva linii mai jos

În plus, mai adăugăm (imediat după WP_DEBUG) și :

$local_url = 'http://localhost/';
define( 'WP_SITEURL', $local_url );
define( 'WP_HOME', $local_url );
define( 'WP_CONTENT_URL', $local_url.'wp-content' );
define( 'WP_PLUGIN_URL', $local_url.'wp-content/plugins' );

După ce am clonat baza de date, este nevoie de un ultim pas: copierea folderelor wp-content/themes și wp-content/plugins. File Explorer din CPanel știe să facă Zip la un folder, ceea ce are ca rezultat un transfer ceva mai rapid. După descărcarea arhivei, se extrage în c:\xampp\htdocs\wp-content.

Salvăm, accesăm http://localhost/wp-admin și:

  • În unele cazuri se întâmplă ca tema să fie schimbată. Appearance->Themes și ne asigurăm că tema corectă este selectată;
  • Settings->Permalinks->Save Changes (fără nici o altă modificare)
Sincronizarea uploads

Dacă ai un site vechi, probabil ai strâns câteva mii de fișiere în wp-content/uploads, plus cele trei redimensionări standard pentru imagini, plus mărimile extra, plus ce o mai fi. Ca să nu fie nevoie să le copiezi, poți adăuga un .htaccess în wp-content/uploads ce conține următorul cod:

RewriteEngine On
RewriteBase /wp-content/uploads/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) http://live-url/wp-content/uploads/$1 [L]

Evident, e nevoie să actualizezi live-url cu site-ul tău.

În momentul de față ar trebui să ai un site complet funcțional, accesibil doar local, numai bun de experimentat!

Modificari în Core

Pentru că există cazuri în care poți fi tentat să maltratezi fișiere de care nu ar trebui să te atingi, în articolele următoare îți voi explica cum poți face anumite lucruri, fie cu plugin-uri, fie din fișierele temei.

Pentru asta am nevoie de puțin ajutor. Lasă un comentariu cu problema avută de tine și voi încerca să îți prezint o soluție ce implică bune practici și care nu se strică la primul update.

47 Comentarii to “WordPress – Instalare Locală”

  1. Tare articolul. Am trecut prin situatia asta cand am fost fortat sa fac dev local fara access la internet.

    As sugera instalare wp in folder separat totusi. Local host/WordPress fiindca ai avea nevoie de server si pentru altele (gen Zend)

  2. Staicu Ionuț-Bogdan

    @Will: Nu cred că cineva care folosește Zend are nevoie de un astfel de articol :)

  3. Mai ai si alte motive anti-auto-update, cum ar fi faptul ca tii codul sub git si nu dai permisiuni serverului de pe live sa faca commit-uri (safety and shit)

  4. @Dan de ce ai tine wp sub git? E doar core files.

  5. poti redenumi articolul:
    Cum sa fii cizmar la tine acasa. Unelte pentru a lucra cu cizmele.

    sorry, i-as impusca pe aia care au scris wp-ul si i-as supune la chinuri extreme pe toti coadarii de wp. daca vrei sa inveti pe cineva cum sa scrie cod ii dai sursa wp ca exemplu de “asa nu”

  6. ps: xampp? really?

  7. @semeketh ce a patit WordPress era inevitabil. Dar merge. Si merge bine. Si ce are XAMP?!

  8. @Will: tocmai pentru ca update-urile (core, plugins, etc.) sa fie testate pe server de staging si pentru easy deployment si dev setup (cand se alatura un alt programator proiectului: isi cloneaza proiectul, initializeaza submodulele si e gata de munca)

  9. will, si dacia merge.
    ia gandeste-te cum ar fi atunci cand ti se arde becul sa trebuiasca sa schimbi lustra cu totul? sau daca vecinu isi ia tv nou tv-ul tau nu mai merge.
    nu, wp-ul a fost gandit cu curul de catre chinezi si scris cu picioarele de catre indieni.

  10. Staicu Ionuț-Bogdan

    @semeketh: este vorba strict de o platformă pentru teste. Ai alternative viabile?

  11. @semeketh eh na, ce comparatie ai facut si tu.
    1. WP merge chiar foarte bine
    2. nu exista alternativa mai buna, decat daca imi poti recomanda tu un CMS cu suportul, UI-ul, UX-ul si familiaritatea la WP. Chiar sunt curios.

    Da, codul a devenit spagheti, dar orice platforma care creste in felu acesta devine la fel. Nu ca as face scuze, dar nu ma ating de core de obicei, daca isi face treaba, care e problema?

  12. Staicu Ionuț-Bogdan

    @semeketh: în teorie, ce zici tu e corect. În practică însă, nu toți clienții au buget de (zeci de) mii de euro pentru un CMS sau timpul necesar dezvoltării unui CMS customizat.

    Și eu sunt iritat de anumite aspecte (metode cu sute de linii, html amestecat cu php etc; la o adică vorbim de legacy code vechi de zece ani), dar este un compromis pe care trebuie să-l fac, WP reprezentând un mix bun între ușurința de customizare, ușurința de utilizare, features, plugins etc.

    Un client care a făcut administrare pentru Typo3/Contao a zis că s-a obișnuit cu UI de WP în zece minute. După o zi nu mai prezenta nici un secret pentru el. După o săptămână se întreba cum a putut să stea câțiva ani cu Typo3.

    Ai alternative la WP?

  13. @dan Wp e o dependenta, nu bagi dependente in repo. Lucrezi pe varianta x pentru proiectul tau si gata. Exista bower si npm pentru asta. Si in final nu ar trebui sa te atingi de core. Daca chiar trebuie sa faci asta, faci un fork in alt repo si il folosesti la fel.

  14. @will nu spuneam ca ne atingem de core, ci doar de o practica organizatorica in firma noastra. dar imi dau seama ca am uitat un aspect important: proiectul in sine (plugin, tema, ce e) are repo-ul lui, si este submodul la un repo care contine wp (versiune stabila si testata) si aduna submodule.

  15. @dan suna mai bine, ma chiar miram :)

  16. @ionut, practicile de acum existau si acum 10 ani. nu-mi zi ca atunci era corect sa faci output dintr-o functie sau sa faci abuz de globale. sau ca nu exista un sistem decent de templating.

  17. @semeketh ca framework, WP nu e grozav, dar e superb ca si CMS (Content Management System), pentru asta il folosim – pentru mangement-ul continutului. Eu unul pentru chestii complexe am dezvoltat in timp librarii plugggable care sa faca ce am nevoie cu mai mult sau mai putin ajutor din partea WP

  18. prin comparatie (jumatate din firma noastra face drupal, jumatate wp) drupal e superb ca framework, dar o mizerie ca si CMS

  19. dan, drupal si wp sunt framework-uri la fel cum zend si ci sunt cms-uri.

  20. semeketh: nu te incapatana sa fii gica-contra, sunt convins ca poti intelege ce am scris

  21. Probabil ca prin framework-ul wordpress se refera la un schelet al aplicatiei prin functiile wp care este total corect din punct de vedere al intelesului cuvantului „framework” dar nu si din definitia dobandita de framework-urile serioase si nu 3 functii si alea scrise de indieni. Asta cu framework-ul este la fel cum zece linii de cod si un echo nu mai reprezinta un CMS deoarece WordPress a fost intens promovat ca un CMS.

    Dar clar, sa spui ca wordpress e un framework e aiurea. Adica logic ca merge sa faci orice din el, si incepatorii dupa 3 luni de programare pot scrie un magazin online dar si cum spune semeketh si dacia merge.

  22. Staicu Ionuț-Bogdan

    @semeketh: dacă e să o luăm așa, PHP ca limbaj este destul de… hai să zicem ciudat:
    http://edorian.github.io/2013-10-19-Please-stop-pretending-PHP-is-a-good-language/
    http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/
    http://www.codinghorror.com/blog/2012/06/the-php-singularity.html (un fel de review al articolului anterior)

    Repet: sunt tot felul de compromisuri ce trebuiesc făcute. Fie că-i vorba de limbaj, de platformă etc.

  23. ionut, php-ul este un limbaj foarte potent. sa te legi de limbaj din cauza unora care habar n-au sa scrie cod e ca si cum te-ai lega de McDonalts din cauza grasilor. am citit articoloele, sunt ranturi si atat. tu n-ai ce cauta la linkurile astea, n-ai destula experienta cu php-ul.

    aveai un articol (sau mai multe) despre cum trebuie sa scrii html si cat de importante sunt semantica, folosirea corecta a elementelor, etc etc. sa inteleg ca la programare nu trebuie sa aplicam anumite principii?

  24. Staicu Ionuț-Bogdan

    @semeketh: ok, am priceput. WP sucks. Ai și o alternative?
    Cumva cu legătură: http://css-tricks.com/just-use-insert-cms-still-love-wordpress/

  25. n-am spus ca am. spun doar ca wp-ul e ceva urat care n-ar trebui sa existe. sau cel putin, n-ar mai trebui sa existe in 2013. eu unu m-as apuca de asa ceva, just for the fuck of it. dar nu prea am cu cine si de unu singur e o munca colosala. nu neaparat la programare, dar la partea de ui.

  26. Staicu Ionuț-Bogdan

    @semeketh: eh, vezi? Lucrăm si noi cu ce avem și facem compromisuri.

    Într-o lume perfectă toți am scrie cod după cele mai înalte standarde, T_PAAMAYIM_NEKUDOTAYIM ar fi un pic mai explicit iar OSX nu ar exista. Nu le putem avea pe toate :)

  27. @semeketh si @dan in concluzie… Dacia e cea mai buna masina ce o avem? :p

  28. @will, da. atata vreme cat nu vrei sa inveti sa conduci un porche.

  29. @semeketh si unde e porche-ul asta?

  30. Staicu Ionuț-Bogdan

    @semeketh: nu știu de ce, dar când vine vorba de PC-uri, totul se reduce la mașini.

    În cazul de față, suntem la începutul anilor 1900 și singurele mașini disponibile sunt cele făcute de Ford (sau cine o fi făcut primul automobil). Sigur, mai sunt și trotinetele Drupal, dar asta e altă poveste :D

  31. @will, porche-uri cred ca sunt. da lumea-i invatata cu dacia. nu se pot obisnui cu afisas electronic si schimbator automat. ca sa nu mai spun ca majoritatea fabricilor fac piese pentru dacia, unde nu exista qc.

  32. *afisaj

  33. @sekemeth nici un nume? adica nu am loialitate oarba pentru wp, mi se pare cel mai bun. Daca exista ceva mai bun, te rog zi-mi. Poate invat ceva azi

  34. Super! Idei, solutii nu avem, dar criticam si o dam in metafore prăfuite.

  35. La Clonarea bazei de date din producție nu trebuie și un search/replace în db din www.domeniu-productie în localhost/proiect-local?

  36. Staicu Ionuț-Bogdan

    @pax:
    Este suficient:

    $local_url = 'http://localhost/';
    define( 'WP_SITEURL', $local_url );
    define( 'WP_HOME', $local_url );
    define( 'WP_CONTENT_URL', $local_url.'wp-content' );
    define( 'WP_PLUGIN_URL', $local_url.'wp-content/plugins' );
    

    Search & replace poate genera probleme dacă ai vreun string serializat ce conține url-ul.

  37. @will, dan. am inceput prin a spune ca wp-ul a fost scris cu picioarele. de unde pieile mele ati ajuns la concluzia ca stiu ceva mai bun. sau ca m-ar interesa ceva mai bun. nu-s blogger, 90% din aplicatii le incep de la 0 (framework-ul = 0), nu ma fute grija de cms-urile existente pe piata (99% scrise de indieni pentr americani). am avut ocazia sa lucrez de 2 sau 3 ori cu wp si de atunci refuz constant orice-i legat de wp.

    Repet, wp-ul e scris cu picioarele. da scris in asa fel incat tot prostul sa-l poata modifica. E un soft care n-ar trebui sa existe.

  38. @semeketh Vad ca nu ajungem nicaieri. Unii dintre noi nu sunt asa de norocosi si trebuie sa foloseasca o platforma pentru website-uri. WP e cel mai bun pentru CMS, asa cum e el saracu. Nu vad ce conteaza ca e scris de X pentru Y.

    PS: Sper ca esti platit bine pentru a reinventa roata.

  39. Will, nu ma chinui sa-ti explic de ce “las ca merge si asa” nu-i bine. in afara de faptul ca e o mentalitate tipic romaneasca si total de kkt.

  40. Nu zice nimeni “las ca merge si asa”. WordPress e open-source si inbunatatit pe zi ce trece de oricine poate (da si tu inapoi la comunitate daca tot te pricepi).

    Te comporti ca un copil mic ce nu vrea sa manance nimic si ii e foame. Multa lume gandeste ca tine dar, in loc sa enerveze lumea, iau sapa in mana si muncesc.

  41. @Will: Nu reinventeaza roata. Framework-urile existente atat private cat si publice sunt extrem de puternice minimizand astfel extrem codul scris de el fata de codul scris pentru wp. Face alta roata, dar mai eficienta.
    Sa nu mai spun ca o data ce lucreaza cu framework stie OOP, deci fara abuz de functii si globale.

    @semeketh: Totusi, e frumos sa existe si un CMS de genul. Deoarece vine o vreme cand wp-ul aglomerat de atatea pluginuri usoare de folosit si scrise cu picioarele baga clientul la costuri enorme pe dedicat cat si pe optimizare(si na, sa faca ei dacia sa se miste ca Ferrari-ul).

  42. @Ionut Dude, ce-ar fii sa citesti tot inainte sa comentezi? Tipu a zis ca scrie de la zero, fara nici un framework. Daca aia nu inseamna a reinventa roata, nu stiu ce altceva inseamna.

  43. …90% din aplicatii le incep de la 0 (framework-ul = 0)

    oare ce-am vrut sa spun la partea cu framework-ul = 0?

  44. @iamnz, spasiva m-ai făcut om.
    Da.. adică se prinde wp-ul că s-a schimbat adresa și se sesizează & schimbă în db și path-urile pozelor din wp_posts?

  45. Staicu Ionuț-Bogdan

    @Pax: ceva de genul ăsta. Nu te baza că va functiona fără probleme de fiecare dată, dar pentru teste e suficient :)

  46. Mai nou se practica tutorialele video mai usor de facut si foarte interactive, dar si acesta este unul dintre cele mai bune tutoriale scrise.

    Tot respectul.

Show trackbacks

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>