Memory Wiki

Untitled Session

2026-05-28 18:26 UTC · 115 messages · cli

You2026-05-28 18:29 UTC
How do FluentCommunity and BuddyPress handle scheduling posts? I need: 1. The full code for FluentCommunity's scheduled post feature — the `scheduled_at` field on the Feed model, the controller logic in FeedsController@store that handles scheduled_at input, and the cron job that publishes scheduled feeds at the right time. 2. How BuddyPress handles activity scheduling (if at all) — does it support scheduled activity updates? 3. The UI side — how does the compose form present the scheduling option to the user? Date picker, time selector, etc. Show me the actual code, not just descriptions.
Donna2026-05-28 18:29 UTC
I'll systematically investigate both plugins. Let me start by exploring the structure of each.
Tool2026-05-28 18:29 UTC
{"total_count": 25, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/database/Migrations/FeedMigrator.php", "line": 39, "content": " `scheduled_at` DATETIME NULL,"}, {"path": "/var/www/wordpress-plugins/plugins/fluent-community/database/Migrations/FeedMigrator...
Tool2026-05-28 18:29 UTC
{"total_count": 40, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/Modules/Course/Services/CourseHelper.php", "line": 273, "content": " if (strtotime($lesson->scheduled_at) > strtotime($activity->updated_at)) {"}, {"path": "/var/www/wordpress-plugins/plugins/flu...
Tool2026-05-28 18:29 UTC
{"total_count": 3, "matches": [{"path": "/var/lib/docker/volumes/staging_wp_data/_data/wp-content/plugins/buddypress/bp-activity/classes/class-bp-akismet.php", "line": 623, "content": "\t\tif ( ! wp_next_scheduled( 'bp_activity_akismet_delete_old_metadata' ) )"}, {"path": "/var/lib/docker/volumes/st...
Donna2026-05-28 18:29 UTC
Good. Let me read the key source files now.
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|\n 3|namespace FluentCommunity\\App\\Http\\Controllers;\n 4|\n 5|use FluentCommunity\\App\\Functions\\Utility;\n 6|use FluentCommunity\\App\\Models\\Media;\n 7|use FluentCommunity\\App\\Models\\NotificationSubscriber;\n 8|use FluentCommunity\...
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|\n 3|namespace FluentCommunity\\App\\Models;\n 4|\n 5|use FluentCommunity\\App\\Functions\\Utility;\n 6|use FluentCommunity\\App\\Services\\FeedsHelper;\n 7|use FluentCommunity\\App\\Services\\Helper;\n 8|use FluentCommunityPro\\App\\Models\\...
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|// phpcs:disable\n 3|namespace FluentCommunity\\Database\\Migrations;\n 4|\n 5|class FeedMigrator\n 6|{\n 7| /**\n 8| * @param bool $isForced\n 9| * @return void\n 10| */\n 11| public static function migrate($isFor...
Donna2026-05-28 18:29 UTC
Now let me get the rest of the FeedsController@store method and find the cron/scheduler code.
Tool2026-05-28 18:29 UTC
{"content": " 500| if ($feed->status == 'scheduled') {\n 501| do_action('fluent_community/feed/scheduled', $feed);\n 502| /* translators: %s: The scheduled date and time for the post */\n 503| $message = sprintf(__('Your post has been scheduled for %s'...
Tool2026-05-28 18:29 UTC
{"total_count": 12, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/admin_app.js", "line": 131, "content": "`);const o=e.topNodeType.createAndFill(void 0,s.content);return o?i(o):\"\"}}})});EH.meta={displayName:\"Prose<clipboard>\",package:\"@milkdown/plugin-clipboar...
Tool2026-05-28 18:29 UTC
{"total_count": 30, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/vendor/woocommerce/action-scheduler/functions.php", "line": 69, "content": "function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) {"}, {"path...
Donna2026-05-28 18:29 UTC
Let me search for the action handler that publishes scheduled feeds, and also check the `sanitizeAndValidateData` method for scheduled_at handling.
Tool2026-05-28 18:29 UTC
{"total_count": 1, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Http/Controllers/FeedsController.php", "line": 501, "content": " do_action('fluent_community/feed/scheduled', $feed);"}]}
Tool2026-05-28 18:29 UTC
{"total_count": 30, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Services/TransStrings.php", "line": 1078, "content": " 'No scheduled posts found!' => __('No scheduled posts found!', 'fluent-community'),"}, {"path": "/var/www/wordpress-plugins/plugins/flue...
Tool2026-05-28 18:29 UTC
{"total_count": 12, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/vendor/woocommerce/action-scheduler/classes/WP_CLI/System_Command.php", "line": 229, "content": "\t * Get oldest and newest scheduled dates for a given set of statuses."}, {"path": "/var/www/wordpress-plugi...
Donna2026-05-28 18:29 UTC
Let me find the listener for the scheduled action and the cron publishing logic.
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Tool2026-05-28 18:29 UTC
{"total_count": 1, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Models/XProfile.php", "line": 124, "content": " return $this->posts()->where('status', 'scheduled')->where('scheduled_at', '!=', null);"}]}
Tool2026-05-28 18:29 UTC
{"content": " 110| // Relationship: Users this user follows\n 111| public function follows()\n 112| {\n 113| return $this->hasMany(Follow::class, 'follower_id', 'user_id');\n 114| }\n 115|\n 116| // Relationship: Users following this user\n 117| public functi...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Tool2026-05-28 18:29 UTC
{"total_count": 11, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/Modules/Integrations/FluentPlayer/Bootstrap.php", "line": 43, "content": " $this->app->addFilter('fluent_community/feed/new_feed_data', [$this, 'maybeAddFluentPlayerMedia'], 10, 2);"}, {"path": "/var...
Donna2026-05-28 18:29 UTC
Let me look at the `sanitizeAndValidateData` method to see how scheduled_at triggers 'scheduled' status, and check for any cron-based publishing.
Tool2026-05-28 18:29 UTC
{"content": " 1200| // Use GD if Imagick is not available\n 1201| $image = @imagecreatefromjpeg($file['file']);\n 1202| if ($image === false) {\n 1203| return $file;\n 1204| }\n 1205|\n 1206| switch ($orientation) {\n 1207...
Tool2026-05-28 18:29 UTC
{"total_count": 6, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Services/FeedsHelper.php", "line": 429, "content": " $sanitizedData = self::sanitizeAndValidateData($feedData);"}, {"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Services/FeedsH...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 499| public static function sanitizeAndValidateData($data)\n 500| {\n 501| $message = CustomSanitizer::unslashMarkdown(trim(Arr::get($data, 'message')));\n 502|\n 503| // Decode HTML entities and strip all whitespace for validation\n 504| $message...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 1, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Http/Controllers/FeedsController.php", "line": 500, "content": " if ($feed->status == 'scheduled') {"}]}
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Donna2026-05-28 18:29 UTC
Let me re-read the store method more carefully and look at the FeedsHelper processFeedMetaData method which might handle scheduled_at.
Tool2026-05-28 18:29 UTC
{"content": " 364| public function store(Request $request)\n 365| {\n 366| $user = $this->getUser(true);\n 367|\n 368| do_action('fluent_community/check_rate_limit/create_post', $user);\n 369|\n 370| $requestData = $request->all();\n 371|\n 372| $d...
Tool2026-05-28 18:29 UTC
{"total_count": 6, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/Modules/Migrations/Helpers/PostMigrator.php", "line": 167, "content": " [$feedData, $media] = FeedsHelper::processFeedMetaData($feedData, []);"}, {"path": "/var/www/wordpress-plugins/plugins/fluent-co...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 651| public static function processFeedMetaData($data, $requestData, $existingFeed = null)\n 652| {\n 653| if (empty($data['meta'])) {\n 654| $data['meta'] = [];\n 655| }\n 656|\n 657| $uplaodedDocs = [];\n 658| // Handle Sur...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 731| return [$data, $uplaodedDocs];\n 732| }\n 733|\n 734| // Let's handle the uploaded media\n 735| $mediaImages = Arr::get($requestData, 'media_images', []);\n 736| if ($mediaImages) {\n 737| $uploadedImages = Helper::ge...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 20, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/Modules/Course/Services/CourseHelper.php", "line": 273, "content": " if (strtotime($lesson->scheduled_at) > strtotime($activity->updated_at)) {"}, {"path": "/var/www/wordpress-plugins/plugins/flu...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Tool2026-05-28 18:29 UTC
{"total_count": 8, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Hooks/Handlers/ActivationHandler.php", "line": 25, "content": " if (!\\as_next_scheduled_action('fluent_community_scheduled_hour_jobs')) {"}, {"path": "/var/www/wordpress-plugins/plugins/fluent-co...
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Donna2026-05-28 18:29 UTC
Excellent! Found the cron. Let me read the Scheduler handler.
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|\n 3|namespace FluentCommunity\\App\\Hooks\\Handlers;\n 4|\n 5|use FluentCommunity\\App\\Functions\\Utility;\n 6|use FluentCommunity\\App\\Models\\NotificationSubscription;\n 7|use FluentCommunity\\Framework\\Support\\Arr;\n 8|use FluentCommu...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 20, "files": ["/var/www/wordpress-plugins/plugins/fluent-community-pro/fluent-community-pro.php", "/var/www/wordpress-plugins/plugins/fluent-community-pro/app/Services/ProHelper.php", "/var/www/wordpress-plugins/plugins/fluent-community-pro/app/Services/PluginManager/FluentLicensing....
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 30, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community-pro/app/Hooks/Handlers/CourseEmailNotificationHandler.php", "line": 32, "content": " add_action('fluent_community/section/scheduled_at_updated', [$this, 'resetScheduledNotification'], 10, 2);"}, {"pa...
Donna2026-05-28 18:29 UTC
Found the Pro addon code. Let me read all the key files.
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|\n 3|namespace FluentCommunityPro\\App\\Hooks\\Handlers;\n 4|\n 5|use FluentCommunity\\Framework\\Support\\Arr;\n 6|use FluentCommunity\\App\\Services\\Helper;\n 7|use FluentCommunity\\App\\Models\\Feed;\n 8|\n 9|class SchedulePostHandler...
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|\n 3|namespace FluentCommunityPro\\App\\Http\\Controllers;\n 4|\n 5|use FluentCommunity\\Framework\\Http\\Request\\Request;\n 6|use FluentCommunity\\App\\Services\\FeedsHelper;\n 7|use FluentCommunity\\App\\Services\\Helper;\n 8|use FluentCom...
Donna2026-05-28 18:29 UTC
Now let me check the Pro routes and look for the UI (Vue.js compose form).
Tool2026-05-28 18:29 UTC
{"content": " 90|});\n 91|\n 92|$router->prefix('moderation')->withPolicy(\\FluentCommunityPro\\App\\Http\\Policies\\ModerationPolicy::class)->group(function ($router) {\n 93| if (Helper::isFeatureEnabled('content_moderation')) {\n 94| $router->get('/reports', [\\FluentCommu...
Tool2026-05-28 18:29 UTC
{"total_count": 12, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community-pro/vendor/composer/autoload_static.php", "line": 40, "content": " 'FluentCommunityPro\\\\App\\\\Hooks\\\\Handlers\\\\SchedulePostHandler' => __DIR__ . '/../..' . '/app/Hooks/Handlers/SchedulePostHan...
Donna2026-05-28 18:29 UTC
Now let me find the UI side — the compose form in the Vue assets.
Tool2026-05-28 18:29 UTC
{"total_count": 5, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/admin_app.js", "line": 131, "content": "`);const o=e.topNodeType.createAndFill(void 0,s.content);return o?i(o):\"\"}}})});EH.meta={displayName:\"Prose<clipboard>\",package:\"@milkdown/plugin-clipboard...
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 4, "files": ["rg: regex parse error:", " (?:*Compose*)", " ^", "error: repetition operator missing expression"]}
Tool2026-05-28 18:29 UTC
{"total_count": 4, "files": ["rg: regex parse error:", " (?:*.vue)", " ^", "error: repetition operator missing expression"]}
Tool2026-05-28 18:29 UTC
{"total_count": 4, "files": ["rg: regex parse error:", " (?:*compose*)", " ^", "error: repetition operator missing expression"]}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Tool2026-05-28 18:29 UTC
{"total_count": 0}
Tool2026-05-28 18:29 UTC
{"total_count": 4, "files": ["rg: regex parse error:", " (?:*compose*)", " ^", "error: repetition operator missing expression"]}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"output": "/var/www/wordpress-plugins/plugins/fluent-community/assets/images/icons/StickyNoteLine.vue\n/var/www/wordpress-plugins/plugins/fluent-community/assets/images/icons/DiscussLine.vue\n/var/www/wordpress-plugins/plugins/fluent-community/assets/images/icons/Members.vue\n/var/www/wordpress-plu...
Tool2026-05-28 18:29 UTC
{"output": "No resources/src dir found", "exit_code": 0, "error": null}
Donna2026-05-28 18:29 UTC
Let me search the compiled frontend JS for scheduling/datepicker UI patterns and check BuddyPress.
Tool2026-05-28 18:29 UTC
{"total_count": 41, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/element-plus.js", "line": 12, "content": " a ${S} ${S} 0 1 1 0 ${C?\"\":\"-\"}${S*2}"}, {"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/element-plus.js", "line": 13, "co...
Tool2026-05-28 18:29 UTC
{"total_count": 3, "matches": [{"path": "/var/lib/docker/volumes/staging_wp_data/_data/wp-content/plugins/buddypress/bp-core/deprecated/2.2.php", "line": 18, "content": " * regular posts as well as scheduled posts, while preventing post bumping."}, {"path": "/var/lib/docker/volumes/staging_wp_data/_...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|/**\n 3| * Deprecated functions\n 4| *\n 5| * @package BuddyPress\n 6| * @subpackage Core\n 7| * @deprecated 2.2.0\n 8| */\n 9|\n 10|// Exit if accessed directly.\n 11|defined( 'ABSPATH' ) || exit;\n 12|\n 13|/**\n 14| * De...
Tool2026-05-28 18:29 UTC
{"total_count": 27, "matches": [{"path": "/var/lib/docker/volumes/staging_wp_data/_data/wp-content/plugins/buddypress/bp-templates/bp-legacy/buddypress-functions.php", "line": 1056, "content": "\tif ( bp_has_activities ( $activity_args ) ) {"}, {"path": "/var/lib/docker/volumes/staging_wp_data/_data...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|/**\n 3| * BuddyPress - Activity Post Form\n 4| *\n 5| * @package BuddyPress\n 6| * @subpackage bp-legacy\n 7| * @version 12.0.0\n 8| */\n 9|\n 10|?>\n 11|\n 12|<form action=\"<?php bp_activity_post_form_action(); ?>\" method=\"p...
Tool2026-05-28 18:29 UTC
{"total_count": 1, "matches": [{"path": "/var/lib/docker/volumes/staging_wp_data/_data/wp-content/plugins/buddypress/bp-activity/classes/class-bp-activity-activity.php", "line": 21, "content": "class BP_Activity_Activity {"}]}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|/**\n 3| * BuddyPress Activity Classes\n 4| *\n 5| * @package BuddyPress\n 6| * @subpackage Activity\n 7| * @since 1.0.0\n 8| */\n 9|\n 10|// Exit if accessed directly.\n 11|defined( 'ABSPATH' ) || exit;\n 12|\n 13|/**\n 14...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 81|\t/**\n 82|\t * Description of the activity, eg 'Alex updated his profile.'.\n 83|\t *\n 84|\t * @since 1.2.0\n 85|\t * @var string\n 86|\t */\n 87|\tvar $action = '';\n 88|\n 89|\t/**\n 90|\t * The content of the activity item.\n 91|\t *\n 92|\t ...
Donna2026-05-28 18:29 UTC
Let me search the compiled Vue app for the UI code related to scheduling in the compose form.
Tool2026-05-28 18:29 UTC
{"total_count": 3, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/admin_app.js", "line": 133, "content": "`:\"\")+t}},saveSectionMeta(){if(!this.has_pro){this.$notify({title:this.$t(\"Pro Required\"),message:this.$t(\"This feature is only available in the pro versio...
Tool2026-05-28 18:29 UTC
{"total_count": 8, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/element-plus.js", "line": 8, "content": "usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,currentZIndex:o,nextZIndex:r}};function Bd(e){let t;function n(){if(e.value==null)r...
Tool2026-05-28 18:29 UTC
{"total_count": 5, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/admin_app.js", "line": 81, "content": " */let pF;const o2=t=>pF=t,mF=Symbol();function $k(t){return t&&typeof t==\"object\"&&Object.prototype.toString.call(t)===\"[object Object]\"&&typeof t.toJSON!=\...
Donna2026-05-28 18:29 UTC
Let me get the remaining SchedulePostsController methods and search for any source Vue components.
Tool2026-05-28 18:29 UTC
{"content": " 61| }\n 62|\n 63| if ($feed->status !== 'scheduled') {\n 64| return $this->sendError([\n 65| 'message' => __('This is not scheduled post', 'fluent-community-pro'),\n 66| ]);\n 67| }\n 68|\n 69| ...
Tool2026-05-28 18:29 UTC
{"output": "", "exit_code": 0, "error": null}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 1|<?php\n 2|\n 3|namespace FluentCommunity\\App\\Hooks\\Handlers;\n 4|\n 5|use FluentCommunity\\App\\Services\\Helper;\n 6|use FluentCommunity\\Framework\\Foundation\\Application;\n 7|use FluentCommunity\\Database\\DBMigrator;\n 8|use FluentCommunity\\Ap...
Tool2026-05-28 18:29 UTC
{"output": "", "exit_code": 0, "error": null}
Donna2026-05-28 18:29 UTC
Let me do a targeted search of the compiled app.js for the scheduling UI code and check the Pro action registration.
Tool2026-05-28 18:29 UTC
{"content": " 15|\n 16|// Access Management CRM\n 17|(new \\FluentCommunityPro\\App\\Hooks\\Handlers\\AccessManagementCrmHandler())->register();\n 18|\n 19|// Report Content\n 20|(new \\FluentCommunityPro\\App\\Hooks\\Handlers\\ModerationHandler())->register();\n 21|\n 22|// ...
Tool2026-05-28 18:29 UTC
{"total_count": 2, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/app.js", "line": 1, "content": "import{D as i,F as c,K as l,ae as g,ab as R,L as H,S as a,I as r,E as v,O as _,Q as d,R as L,af as Q,J as q,P as V,a7 as Y,B as z,ak as ge,ay as Fe,W as ae,aj as ye,M a...
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"total_count": 1, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/element-plus.js", "line": 8, "content": "usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,currentZIndex:o,nextZIndex:r}};function Bd(e){let t;function n(){if(e.value==null)r...
Tool2026-05-28 18:29 UTC
{"total_count": 2, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/assets/app.js", "line": 1, "content": "import{D as i,F as c,K as l,ae as g,ab as R,L as H,S as a,I as r,E as v,O as _,Q as d,R as L,af as Q,J as q,P as V,a7 as Y,B as z,ak as ge,ay as Fe,W as ae,aj as ye,M a...
Donna2026-05-28 18:29 UTC
Let me check for the compose form template files that might contain the scheduling UI options.
Tool2026-05-28 18:29 UTC
{"total_count": 20, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/Modules/Migrations/Helpers/PostMigrator.php", "line": 154, "content": " // let's create the posts"}, {"path": "/var/www/wordpress-plugins/plugins/fluent-community/Modules/Migrations/Helpers/PostMigra...
Tool2026-05-28 18:29 UTC
{"total_count": 1, "matches": [{"path": "/var/www/wordpress-plugins/plugins/fluent-community/app/Hooks/Handlers/PortalHandler.php", "line": 662, "content": " 'datepicker' => ["}]}
Donna2026-05-28 18:29 UTC
Tool2026-05-28 18:29 UTC
{"content": " 650| 'upload' => [\n 651| 'continue' => __('Continue', 'fluent-community'),\n 652| 'delete' => __('Delete', 'fluent-community'),\n 653| 'deleteTip' => __('press delete to remove', 'fluent-community'...
Donna2026-05-28 18:29 UTC
Now I have all the information. Let me create a comprehensive findings document.
Tool2026-05-28 18:29 UTC
{"bytes_written": 17876, "dirs_created": true, "lint": {"status": "skipped", "message": "No linter for .md files"}}
Donna2026-05-28 18:29 UTC
Here is my complete findings summary: --- ## 1. FluentCommunity Scheduled Posts ### 1A. Database Schema The `fcom_posts` table has a `scheduled_at DATETIME NULL` column (defined after `expired_at`). Migration in `FeedMigrator.php` handles both creation and ALTER TABLE for upgrades. ### 1B. Model `Feed.php` has `scheduled_at` in both `$fillable` and `$publicColumns`. `XProfile.php` has a `scheduledPosts()` relation querying `status = 'scheduled'`. ### 1C. Controller Flow (FeedsController@store) The controller does **not** handle `scheduled_at` directly. It sets `status = 'published'` on line 374, then passes data through `apply_filters('fluent_community/feed/new_feed_data', $data, $requestData)` on line 454. The Pro addon intercepts this filter. ### 1D. Pro Addon — SchedulePostHandler (the full scheduling logic) **`/var/www/wordpress-plugins/plugins/fluent-community-pro/app/Hooks/Handlers/SchedulePostHandler.php`** Key points: - `maybeSchedulePost()` hooks into `fluent_community/feed/new_feed_data` - Only admins/moderators (`is_admin` flag) can schedule - Changes status from `'published'` to `'scheduled'` and sets `scheduled_at` - Validates minimum 30-minute delay - Registers an **Action Scheduler** single-action at the exact UTC timestamp - `publishScheduledPost()` — the cron callback that changes status from `'scheduled'` to `'published'` and fires post-creation hooks ### 1E. Cron Mechanism Uses **WooCommerce Action Scheduler** (bundled in `vendor/woocommerce/action-scheduler/`). Each scheduled feed gets its own `as_schedule_single_action()` at the exact UTC timestamp. The hook is `fluent_community/feed/scheduled_publish`. This is NOT polled — Action Scheduler processes due actions on every WordPress request. ### 1F. API Endpoints (Pro) - `GET /scheduled-posts/` — list scheduled posts - `POST /scheduled-posts/publish/{id}` — early publish - `PUT /scheduled-posts/{id}` — reschedule ### 1G. UI The compose form uses **Element Plus** (Vue 3) with `<el-date-picker type="datetime">`. The datepicker localization strings in `PortalHandler.php` confirm date+time selection support. The source `.vue` files are compiled into minified `app.js`. --- ## 2. BuddyPress — No Activity Scheduling **BuddyPress does NOT support scheduled activity updates.** The `BP_Activity_Activity` class has no `scheduled_at` field and no scheduling logic. The activity post form (`post-form.php`) is a simple textarea + submit button with no date picker. The only "schedule" references in BuddyPress are: - `bp_activity_akismet_delete_old_metadata` — a cron job for Akismet cleanup - A deprecated function (`bp_blogs_catch_transition_post_status`, removed in 2.2.0) that handled WordPress **blog post** scheduling transitions in activity stream — this recorded scheduled *blog posts*, not scheduled *activities*. --- ## Files Created - **`/root/scheduled-posts-findings.md`** — Full document with all code excerpts and analysis.