DSmidge

Statistika

Pridružen/a:
29 maj 2015, 20:05
Zadnjič aktiven:
Prispevki:
Teme:
0 | Vse teme
8
0
0
#2

Živjo,



ker ne vem, kako močen si v programiranju, bom napisal bolj uporabniško verzijo, kako to popraviti. Ena od možnosti je, da polje, ki predstavlja ključ in polje, ki vsebuje ta tekst z linki izvoziš v datoteko.




  1. BACKUP baze ali vsaj tabele.


  2. Uporabiš SQL tab v phpMyAdmin. Vpišeš "SELECT imeidstolpca, imestolpcazlinki FROM imetabele WHERE imestolpcaz_linki LIKE '%index.php?%';". Potem na koncu izpisa uporabi Export, da to izvoziš v datoteko. Za format izberi CSV.

    Lahko izbereš še "Custom - display all possible options" in potem pod "Columns separated with:" daš npr. ||| in odstraniš dvojne narekovaje pod "Columns enclosed with:" in "Columns escaped with:".


  3. Potem uporabiš Notepad++ in narediš pripravo UPDATE stavka:


  4. za "Search mode" daš "Regular expressions",


  5. pod "Find what" vpiši: ^"(.?)","(.?)"$ oz. ^(.?)|||(.?)$ ,


  6. pod "Replace with" vpiše: UPDATE imetabele SET imestolpcazlinki = '$2' WHERE imeidstolpca = '$1'.


  7. Sedaj pa še popraviš vrednosti:


  8. "Find what": "index.php?option=com_content&view=article&id=(\d+)" z dvojnimi narekovaji vred,


  9. "Replace with": "index.php?option=com_content&view=article&id=$1&catid=45&Itemid=115" z dvojnimi narekovaji vred.


  10. Preglej kaj imaš pripravljeno tako, da pod Language v Notepad++ izbereš SQL. Mogoče bo kje napaka, če so v tekstu že dvojni narekovaji (če ne izbereš načina z |||) - to ročno popravi. Ker je koda obarvana, boš lažje videl, kje je napaka.


  11. Zaženi kodo za update na strežniku.




Lep pozdrav,

Domen


všeč(3) ni všeč(0) spam(0)
#1

Add_filter('id',...) se, kolikor vem, doda v npr. plugin in ta se nato izvrši, ko WP naleti na istoimenski apply_filters('id',...) v svoji (po navadi core) kodi.



Izvrši (lahko obstaja več addfilter() klicev na applyfilters() z istim id-jem) se pri vsakem izrisu WP strani, ko se pokliče applyfilters() z enakim ID-jem. Ali se addfilter() izvrši večkrat ali samo enkrat, je pa odvisno od primera do primera (recimo lahko se pri izpisu vsakega komentarja). Najlažje boš ugotovil, če dodaš kakšen števec noter.


všeč(1) ni všeč(0) spam(0)
#19

Tako je. Tabelo icl_translations se napolni s podatki o povezanih postih (original + prevodi).


všeč(0) ni všeč(0) spam(0)
#11

Najprej je težava, da se čaka 4 sekunde, da WP sploh vrne rezultat, potem pa še 4 sekunde, da se izriše mapa.



Se bom dotaknil samo 1. dela. WP je zelo CPU intenziven. Premik na kakšen strežnik, ki ima hiter single-thread CPU bo pomagal. Sam imam blog na Pentiumu in bi težko našel boljši HW (za to količino prometa). Lahko da so ti kaj omejili porabo CPU-ja na hostingu?



Če je pa kaj narobe v samem blogu, pa poglej s profilerjem. Predvidevam, da nimaš svojega VPS-ja, tako da si XDebug-om ne boš mogel pomagati. Tam še bistveno lažje najdeš vzrok.



Posortiraj po including in excluding wall time. Tako boš mogoče našel problematične funkcije, ki porabijo večino časa za pripravo strani. Ampak brez XDebug ne boš vedel, iz kje se kličejo, tako da boš moral iskati po kodi in imeti srečo, da boš kaj našel.



Lahko pa za namene debugiranja vse skupaj postaviš na svoj PC. Recimo EasyPHP je vredu.


všeč(1) ni všeč(0) spam(0)
#17

Na tej strani je opisano, kako delujejo različni multilingual plugini. Tako da se je naprej potrebno odločiti za plugin, šele potem se na naredi rešitev za linkanje postov.



WPML imaš en blog, kjer imaš več med seboj povezanih postov v različnih jezikih. Ena od možnosti bi bila, da imajo vsi med seboj povezani prevodi v 1. vrstici ID članka in ID jezika. Potem pa se te ID-je v postu zagrabi in zapiše v WPML tabele. In člankov pa na koncu to tudi pobriše.



Sam pa uporabljam Multisite language switcher. WP je inštaliran v multisite načinu, kjer se nahaja več blogov (vsak v svojem jeziku), članki pa so med seboj povezani.


všeč(1) ni všeč(0) spam(0)
#4

Glede plugina in multisite. Ali bo plugin viden na multisite admin strani ali na posamezni strani je odvisno od tega, kako je napisan plugin. Recimo da se ga aktivira na multisitu in se potem pa posameznih sitih samo prikaže. To je tudi najbolj verjetno.



Glede prevodov pa: Kot pišeš, je ena možnost da prevedeš tekste v pluginu. Narediš novo datoteko s funkcijo za prevod, in v pluginu okoli teksta daš klic to funkcije. Ta potem vrača ali originalno besedilo ali pa prevod - odvisno od jezika, ki ga detektiraš preko globalne nastavitve.



Drugi način pa bi bil, da pogledaš, kje vse se nahajajo klici tega plugina. Potem v HTML-ju, ki ga ta plugin vrne, narediš replace določenih stringov, spet glede na jezik, ki ga detektiraš preko globalnih parametrov. Mogoče to funkcijo za replace podtakenš v kodo za widget, ki ga plugin izrisuje (če seveda deluje preko widget-a).



Malo spominja na hekanje, ampak ne vem, če bo šlo drugače. Na srečo pa ti oba primera omogočata, da čim bolj ločiš prevode od kode. Plugin daj v GIT/SVN/HG, naredi commit. Dodaj prevode, naredi commit. Potem bo pa patchiranje spremenjenih datotek (ali je to plugin ali pa tema, ki ga kliče) relativno enostavno.


všeč(0) ni všeč(0) spam(0)
#19

En način je, da celoten meni sestaviš že na bazi. To bi bilo v primeru, da bi imel v tabeli en kup zapisov, aktualni bi pa bili samo nekateri:

http://guilhembichot.blogspot.com/2013/11/with-recursive-and-mysql.html

V MS-SQL se za te namene uporablja rekurzivni klic s pomočjo WITH ukaza, pri MySQL je pa potrebno malo več telovadbe.



Drugi način, ki je verjetno bolj primeren zate, je pa da uporabiš kakšen bolj ali manj učinkovit (= enostavnejši) algoritem za sestavljanje drevesa - kot so ti že predlagali.



Čisto enostavni način, ki je hkrati zelo neučinkovit, ko imaš veliko podatkov, je da uporabiš dve FOR zanki. Z vsako od njih se sprehodiš skozi svoj seznam in na PARENT_ID dodajaš ID zapise.


// Primer, ko imaš polje $kateg, kjer imaš pod vsakim zapisom spet polje vrednosti (lahko pa to predelaš z uporabo FOREACH)
// Tole pišem na pamet ni pretestirano
// Dele, ki se začnejo s TODO je potrebno še doprogramirati
$result = [];
// Spodnje zanke ponavljaj toliko časa, dokler ne bo nič več za dodati
$repeat = true;
while ($repeat) {
$repeat = false;
for ($a = 0, $ac = count($kateg); $a < $ac; $a++) {
$a_id = $kateg[$a]['id'];
$a_pid = $kateg[$a]['parent_id'];
// TODO: Dodaj preverjanje, če je element že v seznamu $result[], casting
if ($a_pid === null) $result[$a_id]['id_path'] = $a_id; // Sestavljaj pot povezanih ID-jev
for ($b = 0, $bc = count($kateg); $b < $bc; $b++) {
$b_id = $kateg[$b]['id'];
$b_pid = $kateg[$b]['parent_id'];
// TODO: Ni optimalno, ker se mora parent že nahajati v končnem seznamu
if ($a_id === $b_pid && in_array($a_id, $result)) {
// Dodaj v končni seznam
// TODO: Dodaj preverjanje, če je element že v seznamu $result[], casting
$result[$b_id]['id_path'] = $result[$a_id]['id_path'] . '#' . $b_id; // Sestavljaj pot povezanih ID-jev
$repeat = true;
}
}
}
}

Na koncu še posortiraš polje po 'id_path' ter urediš zamike.



Optimizacije so možne: npr. beležiš zapise, ki so že bili dodani in se po njih ne sprehajaš več v naslednjih korakih, idr.


všeč(1) ni všeč(0) spam(0)
#1

Napačen je format datuma: http://php.net/manual/en/function.date.php

Poizkusi: $now->format('Ymd')



Če še kar nebo OK pa uporabi print_r, da vidiš, kaj ti vrne metoda.



Ups ... malo prestaro vprašanje.


všeč(1) ni všeč(0) spam(0)