Facebook Feed mit PHP in Webseite einbinden

Facebook Feed mit PHP in Webseite einbinden

veröffentlicht am 01.03.2018

Kürzlich stellte ein Kunde die Anforderung, den Feed seiner Facebook Seite in der eigenen Webseite einzubinden. Wenn er in Facebook einen neuen Beitrag einstellt, soll dieser automatisch auch in seiner Webseite erscheinen.

Nachdem ich dies vor einigen Jahren schon einmal umgesetzt hatte, ging ich davon aus, dass es nun mit dem aktuellen Facebook SDK für PHP ebenfalls relativ schnell realisierbar ist. Allerdings musste ich nach etlichen Stunden Recherche im Netz feststellen, dass dem nicht so ist. Es gibt viele Codeschnipsel oder komplette Beispiele, die jedoch alle mehr oder weniger nicht lauffähig sind.

Letztlich habe ich mir für das CMS Redaxo ein kleines Modul entwickelt, welches relativ straight die Einbindung eines Facebook Feed z.B. der Facebookgruppe REDAXO in eine Redaxo Webseite erlaubt.

Voraussetzung ist in jedem Fall (auch ohne Integration in Redaxo):

Vorgehensweise

1. Bereitstellen des Facebook SDK für PHP in der eigenen Webseite. In diesem Fall im "lib"-Ordner des Project-AddOn von Redaxo:

 

2. Modul Input

<!-- *******************************************************
Facebook Feed Konfiguration
******************************************************** -->

<fieldset class="form-horizontal">
    <legend>Facebook Feed Einstellungen</legend>

    <div class="form-group">
        <label class="col-sm-2 control-label" for="shadow">Anzahl Posts auf einer Seite</label>
        <div class="col-sm-10">
            <?php
            $options = array(
                '2'=>'zwei',
                '4'=>'vier',
                '5'=>'fünf',
                '10'=>'zehn',
                '20'=>'zwanzig',
                '50'=>'fünfzig'
            );
            ?>
            <select name="REX_INPUT_VALUE[1]" id="shadow" class="form-control">
                <?php foreach ($options as $k=>$v) : ?>
                    <option value="<?php echo $k; ?>"<?php if ($k == "REX_VALUE[1]") echo ' selected="selected"' ?>><?php echo $v; ?></option>
                <?php endforeach ?>
            </select>
        </div>
    </div>

    <div class="form-group">
        <label class="col-sm-2 control-label" for="shadow">Welcher Feed soll angezeigt werden</label>
        <div class="col-sm-10">
            <?php
            $options = array(
                '/REDAXO/'=>'Redaxo CMS',
                '/typo3/'=>'Typo3 inoffizielle Gruppe',
                '/TYPO3News/'=>'Typo3 News',
                '/t3nmagazin/'=>'TN3 Magazin'
            );
            ?>
            <select name="REX_INPUT_VALUE[2]" id="shadow" class="form-control">
                <?php foreach ($options as $k=>$v) : ?>
                    <option value="<?php echo $k; ?>"<?php if ($k == "REX_VALUE[2]") echo ' selected="selected"' ?>><?php echo $v; ?></option>
                <?php endforeach ?>
            </select>
        </div>
    </div>

</fieldset>

 

3. Modul Output

<?php

$itemsCountPerPage = 'REX_VALUE[1]';
$feedSource        = htmlspecialchars('REX_VALUE[2]');
$feedType          = 'feed';

//credentials from your personal FB developer account
$fb = new Facebook\Facebook([
    'app_id'                => '{16629240000000000}',
    'app_secret'            => '{012eda3xxxxxxxxxxxxxxxxxxx}',
    'default_graph_version' => 'v2.12',
]);

//check here: https://developers.facebook.com/tools/accesstoken/
$myAccessToken = '166292vvvvvvvvvvvvvvvvvvvv-vvvvvvvvvvvvvvvv';

$requestAction       = $_REQUEST['action'];
$requestMode         = $_REQUEST['mode'];
$requestFeedNext     = $_REQUEST['feednext'];
$requestFeedPrevious = $_REQUEST['feedprevious'];

try {
    if ($requestAction == "page") {
        if ($requestMode == "next") {
            $myFbGetString = $feedSource.$feedType.'?fields=id,message,created_time,from,permalink_url,full_picture&limit='.$itemsCountPerPage.'$after='.$requestFeedNext;
            $response = $fb->get($myFbGetString, $myAccessToken);
        }
        if ($requestMode == "previous") {
            //$url_data_content_group=json_decode(file_get_contents("".$_REQUEST['feedprevious'].""));
            $myFbGetString = $feedSource.$feedType.'?fields=id,message,created_time,from,permalink_url,full_picture&limit='.$itemsCountPerPage.'$before='.$requestFeedPrevious;
            $response = $fb->get($myFbGetString, $myAccessToken);
        }
    } else {
        $response = $fb->get($feedSource
                             . $feedType
                             . '?fields=id,message,created_time,from,permalink_url,full_picture&limit=' . $itemsCountPerPage, $myAccessToken);
    }

    //main object including all relevant data
    $graphEdge = $response->getGraphEdge();

    echo '<div class="container">';
        foreach ($graphEdge as $item) {
            $myMessage           = roland::truncateText($item['message'], 500, '...', true, true) ;
            $myCreatedTime       = $item['created_time']->format('d.m.Y');
            $myPermaLink         = $item['permalink_url'];
            $myPathToFullPicture = $item['full_picture'];
            $myPictureTitle      = roland::truncateText($item['message'], 100, '...', true, true) ;

            if($myPathToFullPicture == ''){
                $myPathToFullPicture = "/media/dummy-facebook-feed.jpg";
                $myPictureTitle = 'Ich bin ein Dummybild, da kein Beitragsbild existiert.';
            }

            echo '<div class="facebook-item">';
                echo '<div class="row">';
                    echo '<div class="col-md-8">';
                        //var_dump($item);
                        echo '<h3>' . $myCreatedTime . '</h3>';
                        echo '<p>'.($myMessage).'</p>';
                        echo '<br>';
                        echo '<a href="' . $myPermaLink . '" target="_blank" title="Dieser Beitrag auf Facebook">Dieser Beitrag auf Facebook...</a><br>';
                    echo '</div>';
                    echo '<div class="col-md-4">';
                        echo '<a href="' . $myPermaLink . '" target="_blank" title="zum Beitrag auf Facebook">';
                        echo '<img src="' . $myPathToFullPicture . '" title="'.$myPictureTitle.'" class="img-responsive"/>';
                        echo '</a>';
                    echo '</div>';
                echo '</div>';
            echo '</div>';
        }
    echo '</div>';

    //paging
    echo '<div class="row">';
        echo '<div id="feed-paging">';

            echo '<div class="col-md-2">';
            //echo 'opt: an den Anfang';
            echo '</div>';

            echo '<div class="col-md-4">';
                if($graphEdge->getPreviousPageRequest() != null){
                    echo '<form class="frm-feed-paging" action="" method="post">'
                         . '<input class="form-submit-button" type="submit" name="previous" value="&laquo; aktuellere Beiträge" title="aktuellere Beiträge">'
                         . '<input type="hidden" name="action" value="page">'
                         . '<input type="hidden" name="mode" value="previous">'
                         . '<input type="hidden" name="feedprevious" value="' . $graphEdge->getPreviousPageRequest()->getUrl() . '">'
                     . '</form>';
                }
            echo '</div>';
            echo '<div class="col-md-4">';
                if($graphEdge->getNextPageRequest() != null){

                echo '<form class="frm-feed-paging" action="" method="post">'
                     . '<input class="form-submit-button" type="submit" name="next" value="ältere Beiträge &raquo;" title="ältere Beiträge">'
                     . '<input type="hidden" name="action" value="page">'
                     . '<input type="hidden" name="mode" value="next">'
                     . '<input type="hidden" name="feednext" value="' . $graphEdge->getNextPageRequest()->getUrl() . '">'
                     . '</form>';
                }
            echo '</div>';

            echo '<div class="col-md-2">';
            //echo 'opt: an das Ende';
            echo '</div>';

        echo '</div>';
    echo '</div>';


} catch (Facebook\Exceptions\FacebookResponseException $e) {
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
} catch (Facebook\Exceptions\FacebookSDKException $e) {
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
}

 

Die Moduleingabe bietet in dieser Form lediglich die Möglichkeit, die Anzahl der Facebookbeiträge pro Seite festzulegen sowie den Feed als solchen. Ich habe für mich einige Feeds fest hinterlegt, u.a. den Redaxo Feed.

Die Modulausgabe zeigt die Beiträge zweispaltig in Listenform. Am Ende der Liste befindet sich ein Paging. 

Facebook Feed mit PHP in Webseite einbinden

Facebook Feed mit PHP in Webseite einbinden