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