Docker WordPress API aanroepen in ander Docker project

Artikel hoe je de WordPress API wat draait op Docker kan benaderen in een ander Docker project

Voor een project heb ik de WordPress / Woocomerce API nodig om producten op te halen en deze te kunnen gebruiken in een Laravel Project.
Ik gebruik Docker voor beide projecten.

Laravel docker-compose-yml bestand

Voor een Laravel project gebruik ik mijn docker-laravel repository https://github.com/mvd81/docker-laravel maar met Laravel Sail, of andere Docker instellingen werkt dit ook.

WordPress docker-compose.yml bestand

Voor WordPress gebruik ik dit docker-compose.yml bestand.

version: '3'

services:

  # Database
  db:
    image: mysql:8.0.21
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    ports:
      - '3317:3306'
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword

  # WordPress
  wordpress:
    depends_on:
      - db
    ports:
      - '8078:80'
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    volumes:
      - './wordpress:/var/www/html'
      - './wp-content:/home/tw109108/domains/webbouwplus.nl/public_html/wp-content'
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword
      WORDPRESS_DEBUG: 1

networks:
  default:
    external:
      name: laravel_project_network_name

volumes:
  db_data:

Hetzelfde netwerk

Om de projecten te laten communiceren moeten beide projecten op hetzelfde Docker netwerk zitten. Pas in de WordPress docker-compose.yml bestand `laravel_project_network_name` naar de naam van je Laravel project (ps. je Docker Laravel project netwerk moet in type ‘bridge’ draaien).

Na het opstarten van beide projecten (docker-compose up -d) kan ik beide projecten benaderen in een internetbrowser, localhost:laravel-project-port en localhost:wordpress-project-port

WordPress / Woocomerce API benaderen in het Laravel project

Nu wil ik in het Laravel project de WordPress / Woocommerce API aanroepen. Omdat Docker een gesloten systeem is werkt het volgende helaas niet.

$response = Http::get('http://localhost:wordpress-port/wp-json/wc/v3/products');

Je krijgt dan de foutmelding:

cURL error 7: Failed to connect to localhost port  after 0 ms: Couldn't connect to server

Juiste manier om een andere container te benaderen

De juiste manier om de WordPress Docker container te benaderen is om de Docker containernaam te gebruiken. Je kan de Docker containernamen opvragen via de commandline:

docker ps

In de laatste kolom ‘NAME’ zie je de namen van de containers.

Het volgende werkt ‘normaal’ gesproken om iets aan te roepen van een andere container.

$response = Http::get('http://wp-container-naam/wp-json/wc/v3/products');

Helaas krijg je weer dezelfde Curl error:

cURL error 7: Failed to connect to localhost port  after 0 ms: Couldn't connect to server

Dit keer is het geen Docker probleem maar ligt het probleem bij WordPress. Het komt omdat de WP_SITEURL in je Worpress verwijst naar http://localhost:poort-nummer en zoals we dit nu weten kan je dit niet gebruiken in Docker.

Je zou de WP_SITEURL kunnen bijwerken in wp-config.php of dit aanpassen in de wp_options database tabel naar de Docker WordPress containernaam maar dan is de WordPress site uiteraard niet meer te gebruiken in de webbrowser.

Oplossing om een dynamische WP_SITEURL te gebruiken

De oplossing is eenvoudig, om de WP_SITEURL en WP_HOME dynamisch te definiƫren.
Zet in wp-config.php:

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);

Als het goed is zou je nu de WordPress / Woocommerce API kunnen benaderen uit je Laravel project.