Jake Vanderwerf
2026-01-25 b38f03c0e7218762d90fa5092696b127f24f36db
inc/managers/queue/executors/ContentExecutor.php
@@ -1,7 +1,6 @@
<?php
namespace JVBase\managers\queue\executors;
use JVBase\managers\CacheManager;
use JVBase\managers\queue\{Executor, Operation, Progress, Result};
use JVBase\meta\MetaManager;
use JVBase\utility\Features;
@@ -104,7 +103,11 @@
               }
               $this->savePostFields($newId, $postData);
               $results[$id] = ['success' => true, 'new_id' => $newId];
               $results[$id] = [
                  'success' => true,
                  'new_id' => $newId,
                  'processed_fields' => array_keys($postData)
               ];
               if (Features::forContent($content)->has('is_timeline')) {
                  $this->updateTimelineLatestDate($newId);
@@ -117,6 +120,7 @@
            // Existing post update
            if (!$this->verifyOwnership((int)$id)) {
               $progress->failItem($id, 'No permission to modify this post');
               $errors[$id] = 'No permission';
               continue;
            }
            // Check if this is a timeline post
@@ -156,23 +160,34 @@
               $this->updateTimelineLatestDate($parentId);
            }
            $results[$id] = ['success' => true];
            $results[$id] = [
               'success' => true,
               'processed_fields' => array_keys($postData)
            ];
            $progress->advance(1);
            // Clear caches
            CacheManager::for($content)->clear();
            if (jvbSiteUsesFeedBlock()) {
               CacheManager::for('feed')->clear();
            }
         } catch (Exception $e) {
            $progress->failItem($id, $e->getMessage());
            $errors[$id] = $e->getMessage();
            $results[$id] = [
               'success' => false,
               'error' => $e->getMessage()
            ];
         }
      }
      if (!empty($updateTimelineOrder)) {
         foreach ($updateTimelineOrder as $parentID) {
            $this->reorderTimelineByDate($parentID);
         $processedParents = []; // Track to avoid duplicate processing
         foreach ($updateTimelineOrder as $oldParentID) {
            if (in_array($oldParentID, $processedParents)) continue;
            $actualParentId = $this->reorderTimelineByDate($oldParentID);
            $processedParents[] = $actualParentId;
            // If parent changed, mark the new parent as processed too
            if ($actualParentId !== $oldParentID) {
               $processedParents[] = $oldParentID;
            }
         }
      }
@@ -193,7 +208,12 @@
      return new Result(
         outcome: $outcome,
         result: $results
         result: [
            'posts' => $results,
            'errors' => $errors,
            'updated_count' => count(array_filter($results, fn($r) => $r['success'] ?? false)),
            'failed_count' => count($errors)
         ]
      );
   }
@@ -247,10 +267,10 @@
      }
   }
   private function reorderTimelineByDate(int $parentId): void
   private function reorderTimelineByDate(int $parentId): int
   {
      $parent = get_post($parentId);
      if (!$parent) return;
      if (!$parent) return $parentId;
      // Get all posts in this timeline (parent + children)
      $children = get_posts([
@@ -269,6 +289,7 @@
      });
      $newParent = $allPosts[0];
      $actualParentId = $newParent->ID; // Track the actual parent
      // If parent changed, restructure
      if ($newParent->ID !== $parentId) {
@@ -320,13 +341,16 @@
         $timelineTerm = $this->calculateTimelineTerm($previousPost, $post);
         if ($timelineTerm) {
            $this->getorCreateTerm($post->ID, $timelineTerm, 'timeline');
            $this->getOrCreateTerm($post->ID, $timelineTerm, 'timeline');
         }
         $previousPost = $post;
      }
      $this->updateTimelineLatestDate($newParent->ID);
      // Update latest_date AFTER reordering with the actual parent
      $this->updateTimelineLatestDate($actualParentId);
      return $actualParentId; // Return the actual parent ID
   }
   private function updateTimelineLatestDate(int $parentId): void
@@ -345,6 +369,9 @@
         'fields' => 'ids'
      ]);
      // Count: parent + children
      $number = count($children) + 1;
      $allPostIds = array_merge([$parentId], $children);
      // Get all timestamps
@@ -355,7 +382,8 @@
      $latestTimestamp = max($timestamps);
      // Store as UNIX timestamp
      // Update both meta fields
      update_post_meta($parentId, BASE . 'number', $number);
      update_post_meta($parentId, BASE . 'latest_date', $latestTimestamp);
   }
@@ -462,10 +490,6 @@
         $results = $this->createFromDirect($operation, $data, $images, $progress);
      }
      // Clear caches
      CacheManager::for($data['content'])->clear();
      CacheManager::for('feed')->clear();
      return new Result(
         outcome: !empty($results) ? 'success' : 'failed',
         result: $results