Het verschil tussen save_post() en wp_insert_post_data() in WordPress

Soms is de naamgeving van action hooks in WordPress een beetje dubbel zoals de save_post() hook. Wat is de context, wanneer wordt hij aangeroepen en waarom heb ik hem niet gebruikt bij het bewaren van mijn use case?

De verschillen tussen save_post() en wp_insert_post_data

In WordPress zijn zowel save_post() als wp_insert_post_data() hooks die ons als ontwikkelaar de mogelijkheid geven om post data te wijzigen en te manipuleren voordat ze in de database worden opgeslagen. Doch hebben beiden hooks verschillende doeleinden en worden ze in verschillende contexten gebruikt.

save_post()

  • De save_post() hook is een action hook die wordt aangeroepen nadat een post (type) is opgeslagen of bewerkt in de database.
  • Je gebruikt deze best wanneer je acties wil uitvoeren nadat de post is opgeslagen in de database, zoals het bewerken van bijbehorende post meta data, het leggen van post relaties, het versturen van meldingen, enzovoort.
  • Gebruik je best wanneer je gegevens wil aanpassen die al in de database zijn opgeslagen, of als je acties wil uitvoeren die onmiddellijk na het bewaren van de post moeten worden getriggerd.

wp_insert_post_data()

  • De wp_insert_post_meta() is een filter hook die je in staat stelt om de post data te wijzigen of te manipuleren voordat ze in de database worden opgeslagen of of bijgewerkt.
  • Deze filter hook gebruik je best wanneer je post data wil wijzigen voordat ze worden opgeslagen.

Dus, het belangrijkste verschil zit in het tijdstip en het doel van deze hooks:

  • Gebruik save_post() wanneer je acties wilt uitvoeren nadat je post al in de database is opgeslagen.
  • Gebruik wp_insert_post_data() wanneer je de post data wilt wijzigen voordat ze in de database worden opgeslagen.

Een voorbeeld

Zoals je misschien al hebt gelezen in één van mijn andere artikels ben ik volop bezig met de ontwikkeling van een uitgebreide WordPress plugin Dogio Platform genaamd. Meer informatie over het Dogio project vind je hier.

De context

In het Dogio project maak ik gebruikt van het post type dog. Gebruikers hebben de mogelijkheid om via de WordPress backend één of meerdere honden toe te voegen. De eigenschappen van een hond zijn verschillend van een standaard bericht. Alle data wordt opgeslagen als post meta.

Voor het gebruiksgemak maak ik enkel gebruik van een meta box ‘Dog settings’. Deze bevat de velden ‘Naam’ en ‘Ras’ maar zoals je in de afbeelding hierboven merkt maak ik geen gebruik van de standaard titel input maar gebruik ik de wp_insert_post_data() filter hook om het post meta data veld vanuit Advanced Custom Fields (ACF) door te geven naar post_title bij het bewaren van het post type dog.

// Class DogPostType

public function insertPostData($data, $postArray, $unsanitizedPostArray, $update)
{
    if ($data['post_type'] !== self::POST_TYPE) {
        return $data;
    }

    if (
        !array_key_exists('acf', $postArray) ||
        !is_array($postArray['acf']) &&
        !array_key_exists('field_64c2265198b62', $postArray['acf'])
    ) {
        return $data;
    }

    $dogName = $postArray['acf']['field_64c2265198b62'];

    $data['post_title'] = $dogName;

    return $data;
}

 add_filter('wp_insert_post_data', [$this, 'insertPostData'], 10, 4);
PHP