}
/**
- * Update the redirect entry for a given page
- * @param $id int The page_id of the redirect
+ * Update the redirect entry for a given page.
+ *
+ * This methods bypasses the "redirect" table to get the redirect target,
+ * and parses the page's content to fetch it. This allows to be sure that
+ * the redirect target is up to date and valid.
+ * This is particularly useful when modifying namespaces to be sure the
+ * entry in the "redirect" table points to the correct page and not to an
+ * invalid one.
+ *
+ * @param $id int The page ID to check
*/
private function fixRedirect( $id ) {
$page = WikiPage::newFromID( $id );
return;
}
- $rt = $page->getRedirectTarget();
+ $rt = null;
+ $content = $page->getContent( Revision::RAW );
+ if ( $content !== null ) {
+ $rt = $content->getUltimateRedirectTarget();
+ }
if ( $rt === null ) {
// The page is not a redirect
// Delete any redirect table entry for it
- $dbw->delete( 'redirect', array( 'rd_from' => $id ),
- __METHOD__ );
+ $dbw->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+ $fieldValue = 0;
+ } else {
+ $page->insertRedirectEntry( $rt );
+ $fieldValue = 1;
}
+
+ // Update the page table to be sure it is an a consistent state
+ $dbw->update( 'page', array( 'page_is_redirect' => $fieldValue ),
+ array( 'page_id' => $id ), __METHOD__ );
}
/**