Let Op:

Er is een script beschikbaar voor het uitvoeren van search & replace opdrachten genaamd searchreplace(2).php. Dit script zorgt de laatste tijd voor geïnfecteerde websites. Er wordt via dit script een redirect in de database van de website gezet die bezoekers redirect naar reclame sites. Niet alleen dat; kwaadwillenden kunnen eigenlijk elke vorm van code in je site injecteren. Dit komt omdat dit script geen goede verificatie heeft voor wie er gebruik van mag maken. Lees voor meer informatie ook dit artikel van Wordfence. De volgende handleiding maakt gebruik van een plugin welke je alleen kan benaderen als je ingelogd bent en dus niet zomaar misbruikt kan worden.


Een search-replace op de database wordt gebruikt om in één keer een wijziging op meerdere plekken uit te voeren in de database. Vaak wordt een search and replace uitgevoerd wanneer het domein van de site gewijzigd moet worden, of als een site naar HTTPS gezet moet worden. Tijdens deze search-replace wordt er in het database gezocht naar een stuk tekst en wordt deze vervangen door het nieuwe stuk tekst. Een search and replace is een krachtig middel om veel wijzigingen te doen, maar kan er ook voor zorgen dat je website niet meer bereikbaar is. Wij raden daarom aan om een backup te maken via admin.savvii.nl voordat je begint. Mocht er iets verkeerd gaan, dan kun je altijd je database herstellen door de backup terug te zetten.


Er zijn meerdere opties om een search-replace uit te voeren op je database. 

  1. De plugin Better Search Replace
  2. Via WP-CLI (SSH)


De plugin Better Search Replace

De eenvoudigste manier is met de plugin 'Better Search Replace'. Er zijn meerdere plugins met dezelfde functionaliteit, mocht je deze niet fijn vinden. In onderstaande instructies zullen we een site gaan omzetten van HTTP naar HTTPS


1. Installeer de plugin via je WordPress Admin-panel

2. Ga naar 'Tools' > 'Better Search Replace'

3. In het onderstaande voorbeeld passen we de URLs van een fictieve site (http://www.example.com) aan naar HTTPS (https://www.example.com). Vul de waarden in die je wilt zoeken en wat je wilt vervangen en selecteer alle tabellen. Vervang de GUIDs niet. Voer vervolgens eerst een 'dry run' uit.



4. Controleer na het uitvoeren van de dry-run de output. 



5. Als de output juist is, haal dan het vinkje bij Run as dry run weg en voer de Search/Replace daadwerkelijk uit. 

6. Hierna is het belangrijk alle caches van je site te legen om de wijzigingen te kunnen zien. 


Let op! Voorkom fouten in stap 2. Bedenk je het volgende: als je in je database bijvoorbeeld 'www.domein.nl' omzet naar 'https://www.domein.nl' dan komen de links in de database eruit te zien als 'http://https://www.domein.nl'. De find/replace vervangt heel letterlijk wat hij vindt. Zorg dus dat de scope van je zoekactie klopt maar dat hetgeen dat dit gaat vervangen ook juist is. 


Via WP-CLI (SSH)

SSH toegang is alleen mogelijk (in béta) op VPS-accounts en is op dit moment niet standaard actief, maak een ticket aan via support.savvii.nl als je aan de béta mee wilt doen. Een find-replace kun je uitvoeren door het gebruik van WP-CLI. In onderstaande instructies zullen we een site gaan omzetten van HTTP naar HTTPS 


1. Ga naar de map wordpress/current (cd wordpress/current)

2. Het commando voor find-replace is wp search-replace 'tevervangendeel' 'vervangenddeel' --skip-columns=guid. Voer eerst een dry-run (test) uit. Hiervoor voeg je de parameter --dry-run toe. 


$ wp search-replace 'http://www.example.com' 'https://www.example.com' --skip-columns=guid --dry-run
+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta   | meta_key              | 0            | SQL  |
| wp_commentmeta   | meta_value            | 0            | PHP  |
| wp_comments      | comment_author        | 0            | SQL  |
| wp_comments      | comment_author_email  | 0            | SQL  |
| wp_comments      | comment_author_url    | 0            | SQL  |
| wp_comments      | comment_author_IP     | 0            | SQL  |
| wp_comments      | comment_content       | 0            | SQL  |
| wp_comments      | comment_approved      | 0            | SQL  |
| wp_comments      | comment_agent         | 0            | SQL  |
| wp_comments      | comment_type          | 0            | SQL  |
| wp_links         | link_url              | 0            | SQL  |
| wp_links         | link_name             | 0            | SQL  |
| wp_links         | link_image            | 0            | SQL  |
| wp_links         | link_target           | 0            | SQL  |
| wp_links         | link_description      | 0            | SQL  |
| wp_links         | link_visible          | 0            | SQL  |
| wp_links         | link_rel              | 0            | SQL  |
| wp_links         | link_notes            | 0            | SQL  |
| wp_links         | link_rss              | 0            | SQL  |
| wp_options       | option_name           | 0            | SQL  |
| wp_options       | option_value          | 1            | PHP  |
| wp_options       | autoload              | 0            | SQL  |
| wp_postmeta      | meta_key              | 0            | SQL  |
| wp_postmeta      | meta_value            | 0            | PHP  |
| wp_posts         | post_content          | 0            | SQL  |
| wp_posts         | post_title            | 0            | SQL  |
| wp_posts         | post_excerpt          | 0            | SQL  |
| wp_posts         | post_status           | 0            | SQL  |
| wp_posts         | comment_status        | 0            | SQL  |
| wp_posts         | ping_status           | 0            | SQL  |
| wp_posts         | post_password         | 0            | SQL  |
| wp_posts         | post_name             | 0            | SQL  |
| wp_posts         | to_ping               | 0            | SQL  |
| wp_posts         | pinged                | 0            | SQL  |
| wp_posts         | post_content_filtered | 0            | SQL  |
| wp_posts         | post_type             | 0            | SQL  |
| wp_posts         | post_mime_type        | 0            | SQL  |
| wp_term_taxonomy | taxonomy              | 0            | SQL  |
| wp_term_taxonomy | description           | 0            | SQL  |
| wp_termmeta      | meta_key              | 0            | SQL  |
| wp_termmeta      | meta_value            | 0            | SQL  |
| wp_terms         | name                  | 0            | SQL  |
| wp_terms         | slug                  | 0            | SQL  |
| wp_usermeta      | meta_key              | 0            | SQL  |
| wp_usermeta      | meta_value            | 0            | PHP  |
| wp_users         | user_login            | 0            | SQL  |
| wp_users         | user_nicename         | 0            | SQL  |
| wp_users         | user_email            | 0            | SQL  |
| wp_users         | user_url              | 0            | SQL  |
| wp_users         | user_activation_key   | 0            | SQL  |
| wp_users         | display_name          | 0            | SQL  |
+------------------+-----------------------+--------------+------+
Success: 1 replacement to be made.



3. De output die je krijgt, laat zien in welke tabellen de vervanging uitgevoerd gaat worden. Controleer of de output klopt en controleer of het te vervangen deel en het te vervangen deel echt juist zijn. 

4. Voer hierna het commando zonder de parameter dry-run. In dit voorbeeld zou het dus zijn wp search-replace 'http://www.example.com' 'https://www.example.com' --skip-columns=guid

5. Leeg alle caches. Hierna is de vervanging op de site zichtbaar. 


Let op! Voorkom fouten in stap 4. Bedenk je het volgende: als je in je database bijvoorbeeld 'www.domein.nl' omzet naar 'https://www.domein.nl' dan komen de links in de database eruit te zien als 'http://https://www.domein.nl'. De find/replace vervangt heel letterlijk wat hij vindt. Zorg dus dat de scope van je zoekactie klopt maar dat hetgeen dat dit gaat vervangen ook juist is.