postmeta; } public function get_entity_id_column(): string { return 'post_id'; } public function get_primary_table(): string { global $wpdb; return $wpdb->posts; } public function get_primary_id_column(): string { return 'ID'; } public function get_cache_group(): string { return 'wpdo_post_profile'; } public function get_delete_hook(): string { return 'before_delete_post'; } /** * 擴充 WP_Query 支援 wpdo_meta_query / wpdo_orderby */ public function extend_native_query( $query_object ): void { if ( ! ( $query_object instanceof WP_Query ) ) { return; } $wpdo_query = $query_object->get( 'wpdo_meta_query' ); if ( empty( $wpdo_query ) || ! is_array( $wpdo_query ) ) { return; } TMDO_Query_Compiler::inject_into_wp_query( $query_object, $wpdo_query ); } /** * Cursor-based 取得 post IDs */ public function get_entity_ids_after( int $after_id, int $limit ): array { global $wpdb; return array_map( 'intval', $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM `{$wpdb->posts}` WHERE ID > %d ORDER BY ID ASC LIMIT %d", $after_id, $limit ) ) ?: array() ); } } // 註冊 pre_get_posts 以啟用 wpdo_meta_query(unit test 下 add_action 未載入時跳過) if ( function_exists( 'add_action' ) ) { add_action( 'pre_get_posts', function ( $query ) { $adapter = TMDO_Entity_Registry::get_adapter( 'post' ); if ( $adapter ) { $adapter->extend_native_query( $query ); } }, 10, 1 ); }