/** * Deletes orphaned files older than 1 minute (due to postponed commits, that has not been used) */ private function clearOrphanedPosts() { $deleteTimestamp = time() - self::DELETE_ORPHANED_POSTS_SECONDS; // Older than 1 minute $orphanedMenuItems = $this->database->get_col($this->database->prepare("SELECT ID FROM {$this->database->posts} AS p\n LEFT JOIN {$this->database->postmeta} AS m ON p.ID = m.post_id\n WHERE post_type = 'nav_menu_item'\n AND post_status = 'draft' AND meta_key = '_menu_item_orphaned' AND meta_value < '%d'", $deleteTimestamp)); foreach ((array) $orphanedMenuItems as $menuItemId) { wp_delete_post($menuItemId, true); $this->committer->discardPostponedCommit('menu-item-' . $menuItemId); } }
/** * Returns all ids from DB suitable for given restriction. * E.g. all comment_id values where comment_post_id = 1 * @param string $entityName * @param array $where * @return array */ private function getIdsForRestriction($entityName, $where) { $idColumnName = $this->dbSchemaInfo->getEntityInfo($entityName)->idColumnName; $table = $this->dbSchemaInfo->getPrefixedTableName($entityName); $sql = "SELECT {$idColumnName} FROM {$table} WHERE "; $sql .= join(" AND ", array_map(function ($column) { return "`{$column}` = %s"; }, array_keys($where))); $ids = $this->database->get_col($this->database->prepare($sql, $where)); return $ids; }
private function fixMnReferences() { $referencesToSave = $this->getExistingMnReferences(); $vpIdsToLoad = $this->getAllVpIdsUsedInReferences($referencesToSave); $idMap = $this->getIdsForVpIds($vpIdsToLoad); $hasAllIds = $this->idMapContainsAllVpIds($idMap, $vpIdsToLoad); if (!$hasAllIds) { return false; } foreach ($referencesToSave as $reference => $relations) { if ($this->entityInfo->isVirtualReference($reference)) { continue; } $referenceDetails = ReferenceUtils::getMnReferenceDetails($this->dbSchema, $this->entityName, $reference); $prefixedTable = $this->database->prefix . $referenceDetails['junction-table']; $sourceColumn = $referenceDetails['source-column']; $targetColumn = $referenceDetails['target-column']; $valuesForInsert = array_map(function ($relation) use($idMap) { $sourceId = $idMap[$relation['vp_id']]; $targetId = $idMap[$relation['referenced_vp_id']]; return "({$sourceId}, {$targetId})"; }, $relations); $sql = sprintf("SELECT id FROM %s WHERE HEX(vp_id) IN ('%s')", $this->database->vp_id, join("', '", array_map(function ($entity) { return $entity['vp_id']; }, $this->entities))); $processedIds = array_merge($this->database->get_col($sql), $this->deletedIds); if ($this->isSelectiveSynchronization) { if (count($processedIds) > 0) { $this->database->query("DELETE FROM {$prefixedTable} WHERE {$sourceColumn} IN (" . join(", ", $processedIds) . ")"); } } else { $this->database->query("TRUNCATE TABLE {$prefixedTable}"); } $valuesString = join(", ", $valuesForInsert); $insertSql = "INSERT IGNORE INTO {$prefixedTable} ({$sourceColumn}, {$targetColumn}) VALUES {$valuesString}"; $this->database->query($insertSql); } return true; }
/** * @param $vpids * @param Database $database * @return mixed */ private static function getIdsForVpids($vpids, $database) { $vpidsForRestriction = self::joinVpidsForRestriction($vpids); return $database->get_col("SELECT id FROM {$database->vp_id} WHERE vp_id IN ({$vpidsForRestriction})"); }