Instagram | Laravel Feeds

Laravel Feeds Help

Instagram

Create files

php artisan make:feed Instagram -t

Filling the feed

<?php declare(strict_types=1); namespace App\Feeds; use App\Feeds\Items\InstagramFeedItem; use App\Models\Product; use DragonCode\LaravelFeed\Data\ElementData; use DragonCode\LaravelFeed\Feeds\Feed; use DragonCode\LaravelFeed\Feeds\Items\FeedItem; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class InstagramFeed extends Feed { public function builder(): Builder { return Product::query(); } public function root(): ElementData { return new ElementData('offers'); } public function header(): string { $name = config('app.name'); $url = config('app.url'); return <<<XML <rss xmlns:g="http://base.google.com/ns/1.0" version="2.0"> <channel> <title>$name</title> <link>$url</link> XML; } public function footer(): string { return "\n</channel>\n</rss>"; } public function item(Model $model): FeedItem { return new InstagramFeedItem($model); } public function filename(): string { return 'instagram.xml'; } }

Filling the feed item

<?php declare(strict_types=1); namespace App\Feeds\Items; use DragonCode\LaravelFeed\Feeds\Items\FeedItem; use Illuminate\Support\Arr; use function collect; use function fake; /** @property-read \App\Models\Product $model */ class InstagramFeedItem extends FeedItem { public function name(): string { return 'item'; } public function toArray(): array { return [ 'g:id' => $this->model->id, 'g:title' => ['@cdata' => $this->model->title], 'g:description' => ['@cdata' => $this->model->description], 'g:link' => route('products.show', $this->model->slug), 'g:image_link' => $this->firstImage(), '@g:additional_image_link' => $this->images(), 'g:brand' => $this->model->brand, 'g:condition' => 'new', 'g:availability' => 'in stock', 'g:price' => $this->model->price, 'g:sale_price' => $this->model->price, 'g:item_group_id' => 12345, 'g:status' => 'active', 'g:color' => ['@cdata' => fake()->colorName()], 'g:size' => fake()->numberBetween(10, 50), 'g:age_group' => 'adult', 'g:material' => ['@cdata' => fake()->word()], 'g:pattern' => ['@cdata' => 'regular'], 'g:google_product_category' => 1000, 'g:fb_product_category' => 2000, ]; } protected function firstImage(): string { return Arr::first($this->model->images); } protected function images(): array { return collect($this->model->images)->skip(1)->all(); } }

Activate

Review the generated operation or migration file, then run the appropriate console command:

# For Laravel Deploy Operations php artisan operations # For Laravel Migrations php artisan migrate

Generate feed

Generate the feed by running the following console command:

php artisan feed:generate

Result

<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0"> <channel> <title>Laravel</title> <link>https://example.com</link> <offers> <item> <g:id>1</g:id> <g:title><![CDATA[temporibus animi assumenda in]]></g:title> <g:description><![CDATA[Sit sit commodi ut quibusdam. Nesciunt explicabo necessitatibus quasi ullam recusandae quidem harum. Dolor ex et cumque voluptate eveniet.]]></g:description> <g:link>https://example.com/products/repudiandae-soluta-qui-et-vel-corporis</g:link> <g:image_link>https://via.placeholder.com/640x480.png/007788?text=et</g:image_link> <g:additional_image_link>https://via.placeholder.com/640x480.png/00ff55?text=voluptatum</g:additional_image_link> <g:additional_image_link>https://via.placeholder.com/640x480.png/00ffee?text=natus</g:additional_image_link> <g:brand>quidem</g:brand> <g:condition>new</g:condition> <g:availability>in stock</g:availability> <g:price>129</g:price> <g:sale_price>129</g:sale_price> <g:item_group_id>12345</g:item_group_id> <g:status>active</g:status> <g:color><![CDATA[MediumPurple]]></g:color> <g:size>45</g:size> <g:age_group>adult</g:age_group> <g:material><![CDATA[rerum]]></g:material> <g:pattern><![CDATA[regular]]></g:pattern> <g:google_product_category>1000</g:google_product_category> <g:fb_product_category>2000</g:fb_product_category> </item> <item> <g:id>2</g:id> <g:title><![CDATA[aut deleniti aliquam possimus]]></g:title> <g:description><![CDATA[Dolore iure consequatur voluptatem doloremque ut. Quaerat quis odit iusto qui. Ut expedita culpa laudantium totam id ea. Repudiandae aut aut enim sit.]]></g:description> <g:link>https://example.com/products/veniam-iste-in-explicabo-voluptas</g:link> <g:image_link>https://via.placeholder.com/640x480.png/009999?text=eos</g:image_link> <g:additional_image_link>https://via.placeholder.com/640x480.png/002288?text=deleniti</g:additional_image_link> <g:additional_image_link>https://via.placeholder.com/640x480.png/0044aa?text=dolore</g:additional_image_link> <g:brand>cupiditate</g:brand> <g:condition>new</g:condition> <g:availability>in stock</g:availability> <g:price>438</g:price> <g:sale_price>438</g:sale_price> <g:item_group_id>12345</g:item_group_id> <g:status>active</g:status> <g:color><![CDATA[PowderBlue]]></g:color> <g:size>24</g:size> <g:age_group>adult</g:age_group> <g:material><![CDATA[eaque]]></g:material> <g:pattern><![CDATA[regular]]></g:pattern> <g:google_product_category>1000</g:google_product_category> <g:fb_product_category>2000</g:fb_product_category> </item> </offers> </channel> </rss>
05 September 2025