Fájl listázó plugin Wordpresshez

Fájl listázó plugin Wordpresshez
2020-12-15T12:19:40+01:00
2021-01-01T16:05:04+01:00
2022-10-15T21:26:10+02:00
tigerpapo
Üdv. Létre hoztam egy wordpress plugint, amely azt a célt szolgálná, hogy egyedi oldalsablonként hozzáad az adott honlaphoz egy dokumentumtárat. A dokumentumtár pedig úgy működik (működne), hogy a plugin gyökerén belül kilistáz egy adott mappa tartalmát.  
Nos valamiért ez a kilistázás nem akar működni kivéve ha a tárhely gyökerében levő mappát adok meg. Ennek a problémának a megoldásában kérném a segítségeteket. Úgy is jó lenne, ha a wp gyökerében levő mappát listázná ki. Előre is köszönök bármilyen útmutatást.

A kódot fájlként mellékeltem a témához.
Mutasd a teljes hozzászólást!
Csatolt állomány
Azért próbálkoztam a relatív eléréssel, mert ugye ez egy wp plugin lenne, melyet bármelyik más wp oldalra fel tudok telepíteni, de ha abszolút útvonalat adok meg, akkor az nem biztos hogy egy másik oldal esetében is érvényes lesz.

Az igen! Szép kijelentés. Ki mondta hogy égesd be az útvonalat? Azt írtam abszolút útvonalat használj, nem azt, hogy fixen írd bele az útvonalat a kódba. Megannyi módja van az aktuális útvonal lekérdezésének, pl. a dirname(), a __FILE__, a __DIR__, sőt, maga a WP is rendelkezik konstansokkal, ilyen pl. az ABSPATH. Sőt, a plugin gyökérkönyvtárát is meg tudja neked csuklóból adni, csak a megfelelő funkciót kellene meghívni, ami: plugin_dir_path()

Az útvonal feldolgozása és a helyes összeállítása a Te feladatod. Nincs univerzális megoldás arra hogy a helyi fájlrendszeren tárolt útvonalból URL legyen. A WP mindenre lehetőséget ad. A fájlokat én mindenképpen a wp-content/uploads alá tenném, oda is tölteném fel (semmi keresnivalója nincs felhasználói fájlnak a plugin könyvtára alatt).

Továbbá: ha a plugint nem direktben hívod (és nem így teszed hanem a WP tölti be) akkor minden relatív hivatkozás a WP gyökérhez lépest relatív, téged ez keverhetett meg. Egy pici önállóságot vigyél a dologba, debuggolj, olvasgasd a Codex-et és a PHP manualt.
Mutasd a teljes hozzászólást!

  • Régen láttam ilyen ronda kódot. Sztring összefűzésekkel barátkozz még. Most komolyan URL-t akarsz megnyitni dir()-el? Ha nem tennél oda @-ot, látnád a hibát.

    getFileList( plugin_dir_url(__FILE__) . 'doktar/' );
    plugin_dir_url()

    Get the URL directory path (with trailing slash) for the plugin __FILE__ passed in.
    Mutasd a teljes hozzászólást!
  • Köszönöm a hozzászólást. Sajnos még kezdő vagyok a témában, s a kód nagy része is ahogyan láttad a forrásban kölcsön kapott kód. Ami azt jelenti, hogy szeretném megérteni a működését, ezért (is) fordultam hozzátok. A @ nemtudom milyen célt szolgál a kódban, valószínűleg véletlenül maradt benne ( az eredeti kódban is szerepelt --> Directory Listing < PHP ).
    Ha a ronda kód alatt a css elemekre gondolsz, azok külön css fájlban fognak szerepelni majd.
    Szóval akkor nem a dir() függvényt kellene használnom vagy máshogy kellene megadnom a megnyitni kívánt mappa helyét?

    Ezzel az elérési úttal sikerül kilistázni a gyökér tartalmát

    $dirlist = getFileList( '/' );
    Viszont, ha tovább adom meg, akkor megszakad a listázás:

    $dirlist = getFileList( '/public_html/doktar/' );
    Mutasd a teljes hozzászólást!
  • A @ nemtudom milyen célt szolgál a kódban,

    Elnyomja a hibaüzeneteket. Amiket ha látnál, látnád mi a hiba.

    Ha a ronda kód alatt a css elemekre gondolsz

    Inkább ezekre:

    "$dir$entry/"

    Szóval akkor nem a dir() függvényt kellene használnom vagy máshogy kellene megadnom a megnyitni kívánt mappa helyét?

    Nem a dir()-el van a baj. Azzal van a baj hogy nem helyes útvonalat adsz át neki. A helyi fájlrendszeren létező útvonalra van szüksége, nem egy relatív, vagy URL hivatkozásra. Minden le van írva a függvény PHP manual oldalán: PHP: dir - Manual
    Mutasd a teljes hozzászólást!
  • Létező útvonallal is próbálkoztam/próbálkozom. Ezzel kilistázza a root-ot (bár nem minden könyvtárat)

    $dirlist = getFileList( '/' );
    Viszont amit nem értek, hogy a szerver public_html mappáját és almappáját miért nem listázza ki?

    $dirlist = getFileList( '/public_html/doktar/' );
    Mutasd a teljes hozzászólást!
  • Ismerkedj meg a relatív és az abszolút elérési útvonal fogalmával. Neked jelen esetben abszolút útvonal kell a helyi fájlrendszeren, és nem egy külső URL-en! A "/" az létező útvonal. De a másik amit írsz az tuti nem. 100% hogy nincs /public_html/ könyvtár. Az felett még vannak.
    Mutasd a teljes hozzászólást!
  • Ismerem a két fogalmat. Azért próbálkoztam a relatív eléréssel, mert ugye ez egy wp plugin lenne, melyet bármelyik más wp oldalra fel tudok telepíteni, de ha abszolút útvonalat adok meg, akkor az nem biztos hogy egy másik oldal esetében is érvényes lesz. Mindenesetre megoldom abszolúttal is, praktikusság szempontjából lett volna jó, ha relatív az útvonal (pl a plugin mappájának almappája).

    A másik probléma: Megvan az útvonal és a program kilistázza szépen a mappákat és fájlokat, viszont, ha ráviszem az egeret a hivatkozások nem úgy jelennek meg ahogy kellene és így használhatatlanok is a linkek. Most a wordpress gyökerébe nyitottam meg a doktar mappát, és ilyen hivatkozásokat ad vissza a választható mappáknak és fájloknak:

    www.oldalam.hu/home/dzklar/public_html/doktar/proba.pdf

    és a helyes megoldás pedig ez lenne:
    www.oldalam.hu/doktar/proba.pdf

    Ezt hogyan tudom orvosolni?
    Mutasd a teljes hozzászólást!
  • Azért próbálkoztam a relatív eléréssel, mert ugye ez egy wp plugin lenne, melyet bármelyik más wp oldalra fel tudok telepíteni, de ha abszolút útvonalat adok meg, akkor az nem biztos hogy egy másik oldal esetében is érvényes lesz.

    Az igen! Szép kijelentés. Ki mondta hogy égesd be az útvonalat? Azt írtam abszolút útvonalat használj, nem azt, hogy fixen írd bele az útvonalat a kódba. Megannyi módja van az aktuális útvonal lekérdezésének, pl. a dirname(), a __FILE__, a __DIR__, sőt, maga a WP is rendelkezik konstansokkal, ilyen pl. az ABSPATH. Sőt, a plugin gyökérkönyvtárát is meg tudja neked csuklóból adni, csak a megfelelő funkciót kellene meghívni, ami: plugin_dir_path()

    Az útvonal feldolgozása és a helyes összeállítása a Te feladatod. Nincs univerzális megoldás arra hogy a helyi fájlrendszeren tárolt útvonalból URL legyen. A WP mindenre lehetőséget ad. A fájlokat én mindenképpen a wp-content/uploads alá tenném, oda is tölteném fel (semmi keresnivalója nincs felhasználói fájlnak a plugin könyvtára alatt).

    Továbbá: ha a plugint nem direktben hívod (és nem így teszed hanem a WP tölti be) akkor minden relatív hivatkozás a WP gyökérhez lépest relatív, téged ez keverhetett meg. Egy pici önállóságot vigyél a dologba, debuggolj, olvasgasd a Codex-et és a PHP manualt.
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen a segítséget. Sikerült megoldanom a problémát. Megfogadtam a tanácsod és az upload mappát használtam a feltöltés helyének. És még egy kérdésem lenne: hogyan tudom megoldani az eredmény időrendi sorbarendezését a lastmod kulcs alapján? Próbálkoztam az usort függvénnyel, de nem érte el a kívánt eredményt (lehet rosszul vagy rossz helyen próbáltam).
    Mutasd a teljes hozzászólást!
  • Szerintem array_multisort kell neked. Az egyes fájlok módosítási idejét uniformizált formában kellene tárolni a sorrendezéshez (pl. unixtime).
    Mutasd a teljes hozzászólást!
  • Rendben. Idáig jutottam: (de ez még nem a kívánt eredmény)

    <?PHP function getFileList($dir) { // array to hold return value $retval = array(); // add trailing slash if missing if(substr($dir, -1) != "/") $dir .= "/"; // open pointer to directory and read list of files $d = @dir($dir) or die("getFileList: Nem sikerült megnyitni a $dir könyvtárat a könyvtár olvasásához."); while(false !== ($entry = $d->read())) { // skip hidden files if($entry[0] == ".") continue; if(is_dir("$dir$entry")) { $retval[] = array( "name" => "$dir$entry/", "type" => filetype("$dir$entry"), "size" => 0, "lastmod" => filemtime("$dir$entry") ); } elseif(is_readable("$dir$entry")) { $retval[] = array( "name" => "$dir$entry", "type" => mime_content_type("$dir$entry"), "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ); } } $d->close(); // Az eredmény dátum szerinti csökkenő sorba rendezése array_multisort($retval[lastmod], SORT_NUMERIC, SORT_DESC); return $retval; } foreach($dirlist as $file) { echo "<tr id='sorok'>\n"; echo "<td><a href="$url/{$file['name']}">",basename($file['name'],".pdf"),"</a></td>\n"; echo "<td id='cella_kozep'><a tabindex="-1" href="$url/{$file['name']}">",basename($file['type']),"</a></td>\n"; echo "<td id='cella_kozep'><a tabindex="-1" href="$url/{$file['name']}">",basename($file['size']),"</a></td>\n"; echo "<td id='cella_kozep'><a tabindex="-1" href="$url/{$file['name']}">",date('Y.m.d.', $file['lastmod']),"</a></td>\n"; echo "</tr>\n"; ?>
    Mutasd a teljes hozzászólást!
  • 1: Olvasd már el a függvény oldalát a PHP manual-ban.
    2: Kétlem hogy létezne "lastmod" nevű konstansod. Idézőjelek (!) hiánya.
    3: Google keresés első találatában a megoldás: How to sort an array of associative arrays by value of a given key in PHP?
    4: Ezeket az idézőjelben változónevek szrint összefüggéseket felejtsd már el.
    Mutasd a teljes hozzászólást!
  • Ok. Úgy néz ki így már jól működik. Köszi a segítséget.

    // Az eredmény dátum szerinti csökkenő sorba rendezése $lastmoddate = array(); foreach ($retval as $key => $row) { $lastmoddate[$key] = $row['lastmod']; } array_multisort($lastmoddate, SORT_DESC, $retval);
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd