get_posts() puslapiavimas pagal ID

Ar įmanoma su get_posts() gauti n-įrašų einančių prieš/po post’o su tam tikru ID? Tam tikrais atvejais, posts_per_page ir offset netinka dėl dažno duomenų atnaujinimo. Todėl bandant pasiekti antrą puslapį gaunami įrašai, kurie jau buvo pirmame puslapyje.

Julius

Taip, įmanomas.

Filtravimas tiesiogiai pagal ID

Šis būdas yra paprasčiausas ir beveik nereikalauja papildomų resursų, tačiau turi vieną esminį trūkūmą – jei įrašai yra publikuojami (Publish) kita eilės tvarka nei yra sukuriami (Add new>Save Draft), šis sprendimas veikia nekorektiškai. Jis remiasi prielaida, kad įrašai su didesniu ID buvo paskelbti vėliau.

WP_Query nepritaikytas tokiam filtravimui, bet čia galima pasinaudoti posts_where filtru. Žemiau pateikiu labai paprastutį proof-of-concept. Šiaip su posts_where reikėtų elgtis atsargiai, nes nuo čia tik vienas žingsnis iki SQL  užklausos, todėl nesunkiai galima padaryti saugumo spragų. Taip pat turėkite omenyje, kad kai kurie įskiepiai naudoja šį filtrą ir jūsų posts_where dalies struktūra gali būti kitokia, nei įprasta.

Filtravimas pagal datą

Norint išvengti aukščiau paminėto nekorektiško veikimo, galima elgtis kitaip – filtruoti ne tiesiogiai pagal ID, o pagal įrašo su specifiniu ID publikavimo datą. Šis metodas visuomet veiks korektiškai, bet kainuos vieną papildomą užklausą į duomenų bazę. Žemiau pateiktas kodas pirmiausiai pagal ID gauna įrašo publikavimo datą ir tada filtruoja pagal ją.

Papildymas. Julius pastebėjo, kad ankstesnė šio kodo versija galėjo veikti ne korektiškai, jei yra daugiau nei 1 įrašas su ta pačia data. Truputį papildžiau pavyzdį, kad dengtų šitą scenarijų. Tiesa, ir dabartinis pavyzdys nėra tobulas. Idealiu atveju į exclude dalį reikėtų pridėti ne tik konkretų post_id, bet visų ankstesniame puslapyje buvusių įrašų ID.