====== PostDao ======
**Layer:** ''DAO'' · **Source:** ''lib/dao/PostDao.php:23'' (lines 23–926)
----
class PostDao extends Dao
======= Docblock Metadata =======
^ Tag ^ Value ^
| ''@category'' | Dao Class |
| ''@author'' | M.Noermoehammad |
| ''@license'' | MIT |
| ''@version'' | 1.0 |
| ''@since'' | Since Release 1.0 |
======= Inheritance =======
^ Relation ^ Type ^ Meaning ^
| extends | [[scriptlog:lib:core:dao|''Dao'']] | parent class/interface |
======= Constants (3) =======
^ Visibility ^ Name ^ Value ^ Line ^
| ''private'' | ''ALLOWED_SORT_COLUMNS'' | ''['ID', 'post_date', 'post_title', 'post_modified'];'' | 30 |
| ''private'' | ''PUBLISHED_FILTER'' | ''"p.post_status = 'publish' AND p.post_visibility = 'public'";'' | 38 |
| ''private'' | ''SELECT_PUBLISHED_COLUMNS'' | ''"p.ID, p.media_id, p.post_author, p.post_date, p.post_modified, p.post_title, p.post_slug…'' | 45 |
======= Properties (0) =======
//None declared.//
======= Methods (31) =======
^ Visibility ^ Method ^ Summary ^ Line ^
| public | ''__construct()'' | (undocumented) | 50 |
| public | ''findPosts()'' | findPosts | 65 |
| public | ''findPublishedPostsPaginated()'' | Find published posts with pagination for API endpoints. | 121 |
| public | ''countPublishedPosts()'' | Count published posts. | 158 |
| public | ''findPublishedPostById()'' | Find a single published post by ID. | 186 |
| public | ''getPostById()'' | Retrieve a single post by its ID regardless of status/visibility. | 216 |
| public | ''findAdjacentPost()'' | Find the adjacent published blog post relative to the given ID. | 251 |
| public | ''findPost()'' | findPost() | 281 |
| public | ''createPost()'' | createPost | 333 |
| public | ''updatePost()'' | updatePost | 385 |
| public | ''publishDueScheduledPosts()'' | Publish all scheduled posts whose post_date has passed. | 460 |
| public | ''nextScheduledPostDate()'' | Get the earliest post_date among still-scheduled posts. | 502 |
| public | ''deletePost()'' | DeletePost | 519 |
| public | ''anonymizePostAuthor()'' | Reassign every post authored by $authorId to a fallback author. | 549 |
| public | ''checkPostId()'' | checkPostId | 565 |
| public | ''totalPostRecords()'' | Total posts records. | 585 |
| public | ''findArchiveIndex()'' | Get distinct year-month combinations with post counts for archive index. | 607 |
| public | ''findPostsByYear()'' | Find published posts by year with pagination. | 637 |
| public | ''countPostsByYear()'' | Count published posts for a given year. | 664 |
| public | ''findPostsByYearMonth()'' | Find published posts by year and month with pagination. | 691 |
| public | ''countPostsByYearMonth()'' | Count published posts for a given year and month. | 720 |
| public | ''searchPostsApi()'' | Search posts with LIKE for API query endpoint. | 745 |
| public | ''findTopicsByPostId()'' | Find topics/categories attached to a post. | 788 |
| public | ''findActiveTopicsByPostId()'' | Find active topics/categories attached to a post. | 814 |
| public | ''deletePostTopics()'' | Delete all topic relationships for a post. | 833 |
| public | ''setPostTopics()'' | Replace all topic relationships for a post. | 849 |
| public | ''deletePostComments()'' | Delete all comments for a post. | 867 |
| public | ''insertPostApi()'' | Insert a post with the given data and return the new ID. | 879 |
| public | ''updatePostApi()'' | Update specific post fields. | 894 |
| private | ''resolveSortColumn()'' | Resolve a safe ORDER BY column from a user-supplied sort key. | 907 |
| private | ''resolveSortDirection()'' | Resolve a safe ORDER BY direction ('ASC' or 'DESC'). | 922 |
======== __construct() ========
public function __construct()
//lines 50–53 (4)//
//Takes no parameters.//
======== findPosts() ========
public function findPosts(string $orderBy = 'ID', ?int $author = null, bool $onlyPublished = true): array
//lines 65–108 (44)//
findPosts
Retrieving all records from table posts
^ Parameter ^ Type ^ Default ^ Description ^
| ''$orderBy'' | ''string'' | '''ID''' | //none// |
| ''$author'' | ''?int'' | ''null'' | //none// |
| ''$onlyPublished'' | ''bool'' | ''true'' | //none// |
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findPublishedPostsPaginated() ========
public function findPublishedPostsPaginated(int $limit, int $offset, string $sortBy = 'ID', string $sortOrder = 'DESC', ?int $author = null): array
//lines 121–149 (29)//
Find published posts with pagination for API endpoints.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$limit'' | ''int'' | //required// | //none// |
| ''$offset'' | ''int'' | //required// | //none// |
| ''$sortBy'' | ''string'' | '''ID''' | //none// |
| ''$sortOrder'' | ''string'' | '''DESC''' | //none// |
| ''$author'' | ''?int'' | ''null'' | //none// |
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== countPublishedPosts() ========
public function countPublishedPosts(?int $author = null): int
//lines 158–177 (20)//
Count published posts.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$author'' | ''?int'' | ''null'' | //none// |
**Returns:** ''int'' — int
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findPublishedPostById() ========
public function findPublishedPostById(int $postId): ?array
//lines 186–204 (19)//
Find a single published post by ID.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
**Returns:** ''?array'' — array|null
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== getPostById() ========
public function getPostById(int $postId): ?array
//lines 216–234 (19)//
Retrieve a single post by its ID regardless of status/visibility.
Used by the API layer so callers never reach into the DAO base
class internals (setSQL/findRow) to read a post.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
**Returns:** ''?array'' — array|null
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findAdjacentPost() ========
public function findAdjacentPost(int $postId, string $direction = 'previous'): ?array
//lines 251–266 (16)//
Find the adjacent published blog post relative to the given ID.
Used by the theme previous/next post navigation. When $direction is
'previous' it returns the post with the largest ID below $postId;
when 'next' it returns the post with the smallest ID above $postId.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | The reference post ID. |
| ''$direction'' | ''string'' | '''previous''' | 'previous' or 'next'. |
**Returns:** ''?array'' — array|null Adjacent post row (ID, post_title, post_slug) or null.
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findPost() ========
public function findPost(int $ID, Sanitize $sanitize, ?int $author = null, bool $onlyPublished = true): ?array
//lines 281–321 (41)//
findPost()
Retrieving a single post record by its ID.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$ID'' | ''int'' | //required// | //none// |
| ''$sanitize'' | [[scriptlog:lib:core:sanitize|''Sanitize'']] | //required// | //none// |
| ''$author'' | ''?int'' | ''null'' | //none// |
| ''$onlyPublished'' | ''bool'' | ''true'' | //none// |
**Returns:** ''?array'' — array|null
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']], ''\InvalidArgumentException''
======== createPost() ========
public function createPost(array $bind, $topicId): int
//lines 333–371 (39)//
createPost
Insert a new post record together with its topic relationships.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$bind'' | ''array'' | //required// | //none// |
| ''$topicId'' | ''(untyped)'' | //required// | //none// |
**Returns:** ''int'' — int
**Throws:** ''\InvalidArgumentException''
======== updatePost() ========
public function updatePost(Sanitize $sanitize, array $bind, int $ID, $topicId): void
//lines 385–447 (63)//
updatePost
Updating an existing post record together with its topic relationships.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$sanitize'' | [[scriptlog:lib:core:sanitize|''Sanitize'']] | //required// | //none// |
| ''$bind'' | ''array'' | //required// | //none// |
| ''$ID'' | ''int'' | //required// | //none// |
| ''$topicId'' | ''(untyped)'' | //required// | //none// |
**Returns:** ''void'' — void
**Throws:** ''\InvalidArgumentException''
======== publishDueScheduledPosts() ========
public function publishDueScheduledPosts(string $now): int
//lines 460–495 (36)//
Publish all scheduled posts whose post_date has passed.
Promotes scheduled posts to 'publish' and flips the featured image
media_access to 'public'. Runs both UPDATEs inside a single transaction
and clears the page cache when any post is promoted.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$now'' | ''string'' | //required// | Current datetime in site timezone ('Y-m-d H:i:s') |
**Returns:** ''int'' — int Number of posts promoted
**Throws:** ''\Throwable''
======== nextScheduledPostDate() ========
public function nextScheduledPostDate(): ?string
//lines 502–509 (8)//
Get the earliest post_date among still-scheduled posts.
//Takes no parameters.//
**Returns:** ''?string'' — string|null Next scheduled datetime ('Y-m-d H:i:s'), or null when none
======== deletePost() ========
public function deletePost(int $ID, Sanitize $sanitize): void
//lines 519–527 (9)//
DeletePost
^ Parameter ^ Type ^ Default ^ Description ^
| ''$ID'' | ''int'' | //required// | //none// |
| ''$sanitize'' | [[scriptlog:lib:core:sanitize|''Sanitize'']] | //required// | //none// |
**Returns:** ''void'' — void
**Throws:** ''\InvalidArgumentException''
======== anonymizePostAuthor() ========
public function anonymizePostAuthor(int $authorId, int $fallbackAuthorId = 1): bool
//lines 549–554 (6)//
Reassign every post authored by $authorId to a fallback author.
The fallback must be validated by the caller (it should exist and must
not be the author being erased); it defaults to user ID 1 for backward
compatibility with existing callers.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$authorId'' | ''int'' | //required// | The author whose posts are being reassigned |
| ''$fallbackAuthorId'' | ''int'' | ''1'' | The author the posts are reassigned to |
**Returns:** ''bool'' — bool
======== checkPostId() ========
public function checkPostId(int $ID, Sanitize $sanitize): bool
//lines 565–576 (12)//
checkPostId
^ Parameter ^ Type ^ Default ^ Description ^
| ''$ID'' | ''int'' | //required// | //none// |
| ''$sanitize'' | [[scriptlog:lib:core:sanitize|''Sanitize'']] | //required// | //none// |
**Returns:** ''bool'' — bool
**Throws:** ''\InvalidArgumentException'', [[scriptlog:lib:core:dbexception|''DbException'']]
======== totalPostRecords() ========
public function totalPostRecords(?int $author = null): int
//lines 585–599 (15)//
Total posts records.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$author'' | ''?int'' | ''null'' | //none// |
**Returns:** ''int'' — int
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findArchiveIndex() ========
public function findArchiveIndex(): array
//lines 607–624 (18)//
Get distinct year-month combinations with post counts for archive index.
//Takes no parameters.//
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findPostsByYear() ========
public function findPostsByYear(int $year, int $limit, int $offset, string $sortBy = 'ID', string $sortOrder = 'DESC'): array
//lines 637–655 (19)//
Find published posts by year with pagination.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$year'' | ''int'' | //required// | //none// |
| ''$limit'' | ''int'' | //required// | //none// |
| ''$offset'' | ''int'' | //required// | //none// |
| ''$sortBy'' | ''string'' | '''ID''' | //none// |
| ''$sortOrder'' | ''string'' | '''DESC''' | //none// |
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== countPostsByYear() ========
public function countPostsByYear(int $year): int
//lines 664–677 (14)//
Count published posts for a given year.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$year'' | ''int'' | //required// | //none// |
**Returns:** ''int'' — int
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findPostsByYearMonth() ========
public function findPostsByYearMonth(int $year, int $month, int $limit, int $offset, string $sortBy = 'ID', string $sortOrder = 'DESC'): array
//lines 691–710 (20)//
Find published posts by year and month with pagination.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$year'' | ''int'' | //required// | //none// |
| ''$month'' | ''int'' | //required// | //none// |
| ''$limit'' | ''int'' | //required// | //none// |
| ''$offset'' | ''int'' | //required// | //none// |
| ''$sortBy'' | ''string'' | '''ID''' | //none// |
| ''$sortOrder'' | ''string'' | '''DESC''' | //none// |
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== countPostsByYearMonth() ========
public function countPostsByYearMonth(int $year, int $month): int
//lines 720–734 (15)//
Count published posts for a given year and month.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$year'' | ''int'' | //required// | //none// |
| ''$month'' | ''int'' | //required// | //none// |
**Returns:** ''int'' — int
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== searchPostsApi() ========
public function searchPostsApi(string $keyword, string $type = 'all', int $limit = 50): array
//lines 745–779 (35)//
Search posts with LIKE for API query endpoint.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$keyword'' | ''string'' | //required// | //none// |
| ''$type'' | ''string'' | '''all''' | 'blog', 'page', or 'all' |
| ''$limit'' | ''int'' | ''50'' | //none// |
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findTopicsByPostId() ========
public function findTopicsByPostId(int $postId): array
//lines 788–799 (12)//
Find topics/categories attached to a post.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== findActiveTopicsByPostId() ========
public function findActiveTopicsByPostId(int $postId): array
//lines 814–825 (12)//
Find active topics/categories attached to a post.
Same as findTopicsByPostId() but only returns topics whose
topic_status flag is 'Y' (visible on the frontend).
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
**Returns:** ''array'' — array
**Throws:** [[scriptlog:lib:core:dbexception|''DbException'']]
======== deletePostTopics() ========
public function deletePostTopics(int $postId): void
//lines 833–836 (4)//
Delete all topic relationships for a post.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
**Returns:** ''void'' — void
======== setPostTopics() ========
public function setPostTopics(int $postId, array $topicIds): void
//lines 849–859 (11)//
Replace all topic relationships for a post.
Deletes existing relationships, then inserts the given topic IDs.
Used by the API layer to persist a post's category assignments.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
| ''$topicIds'' | ''array'' | //required// | List of topic IDs. |
**Returns:** ''void'' — void
**Throws:** ''\InvalidArgumentException''
======== deletePostComments() ========
public function deletePostComments(int $postId): void
//lines 867–870 (4)//
Delete all comments for a post.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
**Returns:** ''void'' — void
======== insertPostApi() ========
public function insertPostApi(array $data): int
//lines 879–884 (6)//
Insert a post with the given data and return the new ID.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$data'' | ''array'' | //required// | Column => value pairs |
**Returns:** ''int'' — int
**Throws:** ''\InvalidArgumentException''
======== updatePostApi() ========
public function updatePostApi(int $postId, array $data): void
//lines 894–897 (4)//
Update specific post fields.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$postId'' | ''int'' | //required// | //none// |
| ''$data'' | ''array'' | //required// | Column => value pairs |
**Returns:** ''void'' — void
**Throws:** ''\InvalidArgumentException''
======== resolveSortColumn() ========
private function resolveSortColumn(string $sortBy): string
//lines 907–912 (6)//
Resolve a safe ORDER BY column from a user-supplied sort key.
Returns a fallback of 'ID' when the requested column is not whitelisted.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$sortBy'' | ''string'' | //required// | //none// |
**Returns:** ''string'' — string
======== resolveSortDirection() ========
private function resolveSortDirection(string $sortOrder): string
//lines 922–925 (4)//
Resolve a safe ORDER BY direction ('ASC' or 'DESC').
Any value other than ASC falls back to DESC.
^ Parameter ^ Type ^ Default ^ Description ^
| ''$sortOrder'' | ''string'' | //required// | //none// |
**Returns:** ''string'' — string
======= Imports =======
^ Alias ^ Fully-qualified name ^
| ''Dao'' | [[scriptlog:lib:core:dao|''Scriptlog\Core\Dao'']] |
| ''DbException'' | [[scriptlog:lib:core:dbexception|''Scriptlog\Core\DbException'']] |
| ''LogError'' | [[scriptlog:lib:core:logerror|''Scriptlog\Core\LogError'']] |
| ''Sanitize'' | [[scriptlog:lib:core:sanitize|''Scriptlog\Core\Sanitize'']] |
----
//This page is generated from source by 'tools/gendoc'. Edits will be overwritten.//