There are 2 ways to create shortcodes.
To create a simple WordPress shortcode, add a shortcode name to the $shortcodes
array in the ShortcodeServiceProvider.
A shortcode is rendered from a method on the ShortcodeServiceProvider or a view in the shortcodes
folder. The priority is the method.
A method on the ShortcodeServiceProvider starts the shortcode name in camelCase followed by 'Shortcode'. If my shortcode is named 'hello-world', then the method would be helloWorldShortcode
.
<?php
namespace App\Providers;
use LaraPress\Shortcodes\ShortcodeServiceProvider as BaseShortcodeServiceProvider;
class ShortcodeServiceProvider extends BaseShortcodeServiceProvider
{
protected $shortcodes = [
'hello-world',
'fancy-title',
];
public function helloWorldShortcode()
{
return 'Hello world!';
}
}
A view should be placed in the shortcodes
view folder named after the shortcode. If my shortcode is named 'fancy-title', then the view would be fancy-title.blade.php
.
If you register fancy-title
as a shortcode, then create a view named fancy-title.blade.php
in the shortcodes
view folder.
A shortcode view has an $attributes
array and a $content
variable available.
<h3 class="{{ array_get($attributes, 'animation') }}">{{ $content }}</h3>
After the view is ready, you can use the shortcode in a WordPress content area.
[fancy-title animation="wave"]Waving Title[/fancy-title]
This can be helpful to create simple shortcodes for objects like Calendars or Employees. It generates a group of shortcodes with a shortcode name related to the object; often slugs work well. For example, calendars with the slug boise
, denver
, and new-york-city
could have shortcode of [boise-calender]
, [denver-calender]
, and [new-york-calender]
.
Create a class implementing the DynamicShortcode interface. A DynamicShortcode requires a shortcodes and render method. The shortcodes method returns an array of Shortcode objects. The render returns a view and it's first argument is a Shortcode object.
<?php
class CalendarShortcode implements DynamicShortcode
{
protected $calendars;
public function __construct(CalendarRepository $calendars)
{
$this->calendars = $calendars;
}
/**
* @return Shortcode[]
*/
public function shortcodes()
{
return $this->calendars->all()->map(function ($calendar) {
return new Shortcode($calendar->id . '-calendar', ['calendarId' => $calendar->id]);
});
}
public function render(Shortcode $shortcode)
{
return view('shortcodes.availability-form', [
'calendarId' => $shortcode->getAttribute('calendarId'),
'days' => $this->calendars->getAvailabilityDays(),
'month' => Carbon::now(),
]);
}
}
Add Dynamic Shortcode class to ShortcodeServiceProvider.php.
class ShortcodeServiceProvider extends BaseShortcodeServiceProvider
{
protected $dynamicShortcodes = [
CalendarShortcode::class,
];