Social-mediaposts publiceren vanuit PHP

Social-mediaposts publiceren vanuit PHP

Er is geen PHP-SDK, dus dit gebruikt de REST-API rechtstreeks. Werkende cURL- en Guzzle-voorbeelden voor het maken, inplannen en controleren van posts.

Er is geen PHP-SDK, dus dit gebruikt de REST-API rechtstreeks. Dat is minder een beperking dan het klinkt: de API is gewoon JSON over HTTPS met een bearer-token, en PHP heeft alles wat je nodig hebt in de standaardbibliotheek.

Als je specifiek vanuit WordPress publiceert, is er een plugin en een RSS-route die minder werk kunnen zijn dan dit zelf schrijven.

Authenticatie

Elk verzoek draagt je API-sleutel als bearer-token:

$apiKey = getenv('BULKPUBLISH_API_KEY');
$baseUrl = 'https://app.bulkpublish.com';

Bewaar de sleutel in de omgeving in plaats van in broncode of een gecommit configuratiebestand.

Een concept maken

$payload = [
    'content'  => 'Check out our latest update!',
    'channels' => [
        ['channelId' => 1, 'platform' => 'x'],
        ['channelId' => 2, 'platform' => 'linkedin'],
    ],
    'status'   => 'draft',
];

$ch = curl_init("$baseUrl/api/posts");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        "Authorization: Bearer $apiKey",
    ],
    CURLOPT_POSTFIELDS     => json_encode($payload),
]);

$response = curl_exec($ch);
$status   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($status >= 400) {
    error_log("BulkPublish error $status: $response");
} else {
    $post = json_decode($response, true);
}

Begin met draft. Het verschijnt in de app, zodat je kunt zien wat je code heeft geproduceerd voordat er iets gepubliceerd wordt.

Hetzelfde met Guzzle

Als je al Guzzle hebt, is het overzichtelijker:

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://app.bulkpublish.com',
    'headers'  => [
        'Authorization' => 'Bearer ' . getenv('BULKPUBLISH_API_KEY'),
        'Content-Type'  => 'application/json',
    ],
]);

$response = $client->post('/api/posts', [
    'json' => [
        'content'     => 'Check out our new feature!',
        'channels'    => [['channelId' => 1, 'platform' => 'instagram']],
        'status'      => 'scheduled',
        'scheduledAt' => '2026-04-10T14:00:00Z',
        'timezone'    => 'America/New_York',
    ],
]);

$post = json_decode((string) $response->getBody(), true);

Kanaal-ID’s vinden

$response = $client->get('/api/channels');
$channels = json_decode((string) $response->getBody(), true);

Zoek ze op of bewaar ze in configuratie. Een ID uit een eenmalig script hardcoderen in iets langdurigs is hoe een deploy op het verkeerde account begint te posten.

Inplanvelden

scheduledAt is een ISO-8601-tijdstempel en timezone is een IANA-naam. Geef de tijdzone expliciet mee voor alles wat terugkeert, anders verschuift je posttijd een uur wanneer de zomertijd verandert.

Handel fouten goed af

De faalmodus die specifiek is voor server-side publiceren, is dat niemand kijkt. Een post die om 3 uur ‘s nachts de validatie niet doorstaat, is stil tenzij jij hem luidruchtig hebt gemaakt.

  • Controleer statuscodes, ga er niet van uit dat een responsbody succes betekent
  • Log de responsbody bij een fout, want die vertelt wat er mis was
  • Respecteer rate limits en wacht in plaats van meteen opnieuw te proberen
FreeProBusiness
API-verzoeken/dag305.00050.000
API-sleutels1510
De 30 per dag van Free is voor evaluatie. Alles wat op een schema draait, heeft een betaald abonnement nodig.

De korte versie

Geen SDK nodig. POST JSON naar /api/posts met een bearer-token, content, channels en een status. Begin met concepten, zoek kanaal-ID’s op, geef een tijdzone mee bij ingeplande posts, en log fouten goed, want server-side publiceren faalt standaard stil.