WordPress: save_post mit der WordPress REST API

Heute habe ich versucht save_post mit der REST API von WordPress anzusteuern, weil ich bei der Änderung eines Meta-Feldes das Thumbnail anpassen wollte. WordPress führt save_post leider nicht beim Aktualisieren eines Beitrags mit der REST API aus, weshalb man sich anders helfen muss.

Das Problem mit save_post

Mit save_post lässt sich grundsätzlich das Speichern von Inhalten manipulieren, bzw. erweitern. Leider wurde bei der WordPress REST API wieder nicht zu Ende gedacht und die Hook save_post nicht ausgeführt.

Hier hilft nur eine Notlösung, die komischerweise angesteuert wird:

updated_postmeta

Diese Hook wird auch durch einen Request an die REST API angesteuert und lässt sich daher für unsere Zwecke verwenden. Die Hook bietet 4 Argumente, eines der Argumente ist die ID des Beitrags, also perfekt um etwas auszulösen, für einen bestimmten Beitrag.

Das Problem: Diese Hook wird immer ausgeführt wenn postmeta aktualisiert wird. Hier ist es also wichtig, dass man irgendwie ein Meta-Feld schafft oder verwendet, welches auch nur in bestimmten Fällen angesteuert, damit nicht jedes Mal etwas ausgeführt wird.

So lässt sich die Hook verwenden:

add_action('updated_postmeta''pixelbart_updated_postmeta', PHP_INT_MAX, 4);
function pixelbart_updated_postmeta(int $meta_id, int $post_id, string $meta_key, mixed $meta_value)
{
    // Hier deinen Code ausführen
}Code-Sprache: PHP (php)

Wie schon erwähnt, wird dieser Code dann IMMER ausgeführt, wenn ein Meta-Feld aktualisiert wird – weshalb ich immer prüfen würde, ob ein bestimmtes Feld aktualisiert wird. Beispielsweise:

add_action('updated_postmeta''pixelbart_updated_postmeta', PHP_INT_MAX, 4);
function pixelbart_updated_postmeta(int $meta_id, int $post_id, string $meta_key, mixed $meta_value)
{
    if ('on' === $meta_value && 'mein_feld' === $meta_key) {
        // Hier deinen Code ausführen
    }
}Code-Sprache: PHP (php)

So lässt sich zumindest vermeiden, dass dein Code bei jeder Aktualisierung ausgeführt wird. $meta_value entspricht dem Wert, deines Meta-Feldes $meta_key.

Der Vorteil: Die Hook wird auch ausgeführt, wenn man mit der REST API arbeitet.