Come svuotare in modo affidabile le regole di riscrittura su più siti?


20

Supponiamo che tu abbia un plug-in che deve scaricare le regole di riscrittura. Fai tutto correttamente con l'hook di attivazione e l'aggiunta di flush in ritardo, quindi tutto è liscio e compatibile.

E poi un bel giorno qualcuno tenta di eseguirlo su più siti.

Invece di semplici scenari come:

  1. Il sito WordPress è stato creato
  2. Il plugin è installato e attivato

Ora hai scenari da incubo come:

  1. Il plug-in è installato e la rete è attiva
  2. Viene creato un nuovo sito WordPress (o un centinaio) in più siti

In teoria dovrebbe funzionare, giusto? In pratica va storto in modo spettacolare:

  • $wp_rewrite lo stato può provenire dal sito sbagliato
  • switch_to_blog() non tiene traccia dello stato di riscrittura
  • la parte "successiva" potrebbe accadere in blog completamente diversi
  • tutti quegli altri plugin, con cui dovresti giocare bene, potrebbero non essere abilitati in modo coerente su siti diversi

Ad esempio, puoi vedere questo problema come tentare di farlo esplode nel modo giusto permalink sul sito principale ogni volta che viene creato un nuovo sito .

Quindi, come farebbe il plugin a scaricare in modo affidabile le regole di riscrittura in più siti :

  1. Quando viene creato un nuovo sito, per il sito?
  2. Quando il sito esistente è attivato da inattivo, per il sito?
  3. Quando il plugin è attivato in rete, per ogni sito?
  4. Quando il plugin è disattivato in rete, per ogni sito?
  5. Forse in altri scenari, che coinvolgono riscrivere il contesto globale cambiando?

Risposte:


11

Nota: questa è una risposta incompleta che verrà espansa in modo incrementale


L'unico modo affidabile per svuotare le regole di riscrittura in più siti, senza potenzialmente distruggere la struttura del permalink del contesto principale e / o di qualsiasi altro blog (a seconda di come e cosa si passa da e verso) è svuotare le regole di riscrittura in un determinato contesto in questo modo :

global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();

Quanto sopra garantisce che la struttura del permalink corretta per il dato contesto sia recuperata e impostata prima di costruire le regole di riscrittura e confermare le modifiche al database.

Ciò non si applica al singolo sito in cui il contesto non è importante, poiché esiste un solo contesto.

flush_rewrite_rules()a mio avviso è imperfetto nella premessa che assume il contesto corretto, ma non tiene conto del nostro uso switch_to_blogper il quale cambia completamente il contesto e ci lascia in un territorio pericoloso se proviamo a svuotare le regole, potenzialmente.

Ecco l' flush_rewrite_rules()aspetto degli interni di :

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->flush_rules( $hard );
}

Non riesco a pensare a un motivo per cui non dovrebbe apparire così:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->init(); //hello....
    $wp_rewrite->flush_rules( $hard );
}

... soprattutto se si considera che il costruttore di WP_Rewritecosa fa? Lo fa ...

public function __construct() {
    $this->init();
}

Toccando il tuo primo punto di preoccupazione per favorire questa linea di pensiero,

Quindi, come farebbe il plugin a scaricare in modo affidabile le regole di riscrittura in più siti :

  • Quando viene creato un nuovo sito, per il sito?

Diamo un'occhiata a ciò che il core di WordPress chiamerà in particolare durante questo processo:

  • primo wpmu_create_blog()
  • che quindi chiama install_blog()che a sua volta chiamapopulate_options()
  • quindi populate_options()imposta la struttura di permalink predefinita nella tabella delle opzioni
  • dopo che install_blog()ha funzionato, wp_install_defaults()quindi viene chiamato
  • quindi wp_install_defaults()scarica le regole di riscrittura per il sito appena creato prima di tornare infine al blog corrente tramite restore_current_blog().

È importante notare che wp_install_defaults()scarica le regole esattamente come ho suggerito sopra:

$wp_rewrite->init();
$wp_rewrite->flush_rules();

... perché è l'unico modo per essere sicuri che le permalink_structureregole e le regole siano corrette per il contesto attuale.

Anche nel problema evidenziato nel problema di Github , il motivo per cui l'utente ha riscontrato il seguente comportamento:

Quando viene creato un nuovo sito, i permalink di livello post vengono interrotti solo sul sito di livello superiore, nella maggior parte delle configurazioni permalink, ma non in tutti:

Questi 2 formati funzionano correttamente.

Predefinito: funziona come previsto

Giorno e nome: funziona come previsto

... è perché se il blog principale ha una struttura permalink Day & Name /%year%/%monthnum%/%day%/%postname%/, quando viene creato un nuovo sito, ha anche una struttura permalink Day & Name /%year%/%monthnum%/%day%/%postname%/per impostazione predefinita, motivo per cui nessun problema rilevante si presenta quando il plug-in Yoast SEO scarica la riscrittura regole sul shutdowngancio.


Sembra giusto. La cosa fastidiosa con l'installazione di un nuovo sito è che non è possibile agganciarsi durante il processo, solo dopo che è già stato completato. Per questo motivo le regole verranno scaricate due volte.
Anton Timmermans,

Il tempo di grazia si esaurisce, quindi punti per cadere sulla spada qui. :) Comunque c'è ancora molto da capire. :(
Rarst

Non è possibile impostare manualmente il contesto in $wp_rewritemodo da poter scorrere e ripristinare ogni sito di rete? Ho un grande sito di rete che soffre di alcuni problemi di permalink sui plugin personalizzati. Realizzare un plugin che aggiunge un cron sembra eccessivo in quanto li ripristinerebbe sempre. Circondarli con un URL personalizzato sarebbe l'ideale ma non so come farlo per tutti i siti.
Adam Patterson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.