{"id":9354,"date":"2021-05-21T00:54:06","date_gmt":"2021-05-21T06:24:06","guid":{"rendered":"https:\/\/www.emizentech.com\/blog\/?p=9354"},"modified":"2022-01-21T11:33:07","modified_gmt":"2022-01-21T11:33:07","slug":"how-to-create-a-plugin-in-shopware","status":"publish","type":"post","link":"https:\/\/multisitelocal.ezxdemo.com\/blog\/how-to-create-a-plugin-in-shopware.html","title":{"rendered":"How To Create A Plugin In Shopware 6: Simple Guide"},"content":{"rendered":"<p>In this article, we will create a sample plugin for Shopware 6. We will create a plugin through a minimal process, then after that will manually set up structures in Shopware6.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Minimal_Plugin_Setup\"><\/span>Minimal Plugin Setup:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>After installing Shopware 6, go to directory path and run the command:<\/p>\n<p><strong>php bin\/console plugin:create EmizentechPlugin<\/strong><\/p>\n<p>Now, go to Admin and select Settings &gt; System &gt; Plugins, where the new plugin Emizentech is listed.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Shopware_6_Plugin_In_Adding_Config_Settings\"><\/span>Shopware 6 Plugin In Adding Config Settings:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Go to plugin directory path \u201ccustom\/plugins\/EmizentechPlugin\/src\/Resources\/config\u201d<br \/>\nAnd create a <strong>config.xml<\/strong> file manually.<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;config xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n        xsi:noNamespaceSchemaLocation=\"https:\/\/raw.githubusercontent.com\/shopware\/platform\/master\/src\/Core\/System\/SystemConfig\/Schema\/config.xsd\"&gt;\r\n    &lt;card&gt;\r\n        &lt;title&gt;EmizentechPlugin settings&lt;\/title&gt;\r\n\r\n    &lt;\/card&gt;\r\n&lt;\/config&gt;\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Shopware_6_Plugin_In_Adding_Service_Settings\"><\/span>Shopware 6 Plugin In Adding Service Settings:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>EmizentechService for now, and we will also put it in the Service subdirectory.\u00a0So, emizentech service setup in <strong>src\/Service\/EmizentechService.php<\/strong><\/p>\n<pre>&lt;?php\r\n\r\nnamespace EmizentechPlugin\\Service;\r\n\r\nclass EmizentechService\r\n{\r\n\r\n    public function emizentechMethod ($variable)\r\n    {\r\n        var_dump($variable);\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>Also adding a line of code in <strong>src\/Resources\/config\/services.xml<\/strong> file, containing the new service:<\/p>\n<pre>&lt;?xml version=\"1.0\" ?&gt;\r\n\r\n&lt;container xmlns=\"http:\/\/symfony.com\/schema\/dic\/services\"\r\n           xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n           xsi:schemaLocation=\"http:\/\/symfony.com\/schema\/dic\/services http:\/\/symfony.com\/schema\/dic\/services\/services-1.0.xsd\"&gt;\r\n\r\n    &lt;services&gt;\r\n\r\n        &lt;service id=\"EmizentechPlugin\\Service\\EmizentechService\"&gt;\r\n\r\n        &lt;\/service&gt;\r\n\r\n    &lt;\/services&gt;\r\n&lt;\/container&gt;\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Shopware_6_Plugin_In_Adding_Event_Subscriber\"><\/span>Shopware 6 Plugin In Adding Event Subscriber:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The event subscriber is the most useful feature in Shopware 6. This allows you to trigger a code if a specific event happens. A standard name and location for the new PHP class would be <strong>src\/Subscriber\/Subscriber.php<\/strong><\/p>\n<pre>&lt;?php\r\n\r\nnamespace EmizentechPlugin\\Subscriber;\r\n\r\nuse Shopware\\Storefront\\Page\\Checkout\\Cart\\CheckoutCartPageLoadedEvent;\r\nuse Shopware\\Storefront\\Page\\Checkout\\Confirm\\CheckoutConfirmPageLoadedEvent;\r\nuse Shopware\\Storefront\\Page\\Product\\ProductPageLoadedEvent;\r\nuse Symfony\\Component\\EventDispatcher\\EventSubscriberInterface;\r\n\r\nclass Subscriber implements EventSubscriberInterface\r\n{\r\n    public static function getSubscribedEvents(): array\r\n    {\r\n        return [\r\n            ProductPageLoadedEvent::class =&gt; 'onProductPageLoaded',\r\n            CheckoutCartPageLoadedEvent::class  =&gt; 'onCheckoutPageLoaded',\r\n            CheckoutConfirmPageLoadedEvent::class =&gt; 'onCheckoutConfirmPageLoaded'\r\n        ];\r\n    }\r\n\r\n    \/**\r\n     * Handles the stuff, that happens on the product detail page\r\n     *\r\n     * @param ProductPageLoadedEvent $event\r\n     *\/\r\n    public function onProductPageLoaded (ProductPageLoadedEvent $event)\r\n    {\r\n        \/\/do something when the product detail page loads\r\n    }\r\n\r\n    \/**\r\n     * Calls onCheckoutPagesRefresh for handling stuff in all checkout pages\r\n     *\r\n     * @param CheckoutConfirmPageLoadedEvent $event\r\n     *\/\r\n    public function onCheckoutConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event) : void\r\n    {\r\n        $this-&gt;onCheckoutPagesRefresh($event);\r\n    }\r\n\r\n    \/**\r\n     * Calls onCheckoutPagesRefresh for handling stuff in all checkout pages\r\n     *\r\n     * @param CheckoutCartPageLoadedEvent $event\r\n     *\/\r\n    public function onCheckoutPageLoaded(CheckoutCartPageLoadedEvent $event) : void\r\n    {\r\n        $this-&gt;onCheckoutPagesRefresh($event);\r\n    }\r\n\r\n    \/**\r\n     * Handles the stuff, that happens in both checkout pages\r\n     *\r\n     * @param CheckoutCartPageLoadedEvent|CheckoutConfirmPageLoadedEvent $event\r\n     *\/\r\n    private function onCheckoutPagesRefresh ($event)\r\n    {\r\n        \/\/do something in the checkout\r\n\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>And also adding a line of code in <strong>services.xml<\/strong> file, containing the new subscriber:<\/p>\n<pre>&lt;service id=\"EmizentechPlugin\\Subscriber\\Subscriber\"&gt;\r\n            &lt;argument type=\"service\" id=\"Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface\"\/&gt;\r\n            &lt;tag name=\"kernel.event_subscriber\"\/&gt;\r\n        &lt;\/service&gt;\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Shopware_6_Plugin_In_Adding_A_Command\"><\/span>Shopware 6 Plugin In Adding A Command:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Shopware 6, allows us not just to run some\u00a0commands but also to create our own. The basic command setup is not very complicated. We just need to create a class, that extends the Command class and has the two most important methods.<\/p>\n<p>The first one is the \u201cconfigure\u201d method. It is not mandatory, but most of the time we need it anyway, because it contains the options and arguments for our command.<\/p>\n<p>Whereas, the second method must be named \u201cexecute\u201d because it is automatically called when you run the command from the console.<\/p>\n<p>We will name our command EmizentechCommand and put it into src\/Command directory.<\/p>\n<p><strong>src\/Comman\/EmizentechCommand.php<\/strong><\/p>\n<pre>&lt;service?php\r\n\r\nnamespace EmizentechPlugin\\Command;\r\n\r\nuse Symfony\\Component\\Console\\Command\\Command;\r\nuse Symfony\\Component\\Console\\Input\\InputArgument;\r\nuse Symfony\\Component\\Console\\Input\\InputOption;\r\nuse Symfony\\Component\\Console\\Input\\InputInterface;\r\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\r\n\r\nclass EmizentechCommand  extends Command\r\n{\r\n    const ARG_NAME = 'argument';\r\n    const OPT_NAME = 'option';\r\n\r\n    protected static $defaultName = 'Emizentechplugin:Emizentechcommand';\r\n\r\n    protected function configure()\r\n    {\r\n        $this-&gt;addArgument(self::ARG_NAME, InputArgument::OPTIONAL, 'This is an optional argument.');\r\n        $this-&gt;addOption(self::OPT_NAME, null, InputOption::VALUE_OPTIONAL, 'This is an optional option.');\r\n    }\r\n\r\n    protected function execute(InputInterface $input, OutputInterface $output) : int\r\n    {\r\n        \/\/get the arguments\r\n        $arguments = $input-&gt;getArguments();\r\n\r\n        \/\/write a line to the console\r\n        $output-&gt;writeln('Emizentech command works.');\r\n\r\n        \/\/return success code\r\n        return 1;\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>And, also need to add an entry to the <strong>services.xml<\/strong> file and tag.<\/p>\n<pre> &lt;service id=\"EmizentechPlugin\\Command\\EmizentechCommand\"&gt;\r\n            &lt;tag name=\"console.command\" command=\"emizentechplugin:emizentechcommand\"\/&gt;\r\n        &lt;\/service&gt;\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Shopware_6_Plugin_In_Adding_A_Controller\"><\/span>Shopware 6 Plugin In Adding A Controller:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A controller is a class that receives requests and handles them. There are two most commonly used types of controllers \u2013 storefront controllers and backend controllers.<\/p>\n<p>First of all, we will add the storefront controller itself: <strong>src\/Storefront\/Controller\/EmizentechController.php<\/strong><\/p>\n<pre>&lt;?php\r\n\r\nnamespace EmizentechPlugin\\Storefront\\Controller;\r\n\r\nuse Shopware\\Core\\Framework\\Routing\\Annotation\\RouteScope;\r\nuse Shopware\\Core\\System\\SalesChannel\\SalesChannelContext;\r\nuse Shopware\\Storefront\\Controller\\StorefrontController;\r\nuse Symfony\\Component\\HttpFoundation\\Request;\r\nuse Symfony\\Component\\HttpFoundation\\Response;\r\nuse Symfony\\Component\\Routing\\Annotation\\Route;\r\n\r\n\/**\r\n * @RouteScope(scopes={\"storefront\"})\r\n *\/\r\nclass EmizentechController extends StorefrontController\r\n{\r\n    \/**\r\n     * @Route(\"\/Emizentech\", name=\"frontend.Emizentechplugin.Emizentech\", methods={\"GET\"})\r\n     *\/\r\n    public function showPage(Request $request, SalesChannelContext $context): Response\r\n    {\r\n        return $this-&gt;renderStorefront('@EmizentechPlugin\/storefront\/page\/Emizentech\/index.html.twig', [\r\n            'customParameter' =&gt; 'Custom parameter value'\r\n        ]);\r\n    }\r\n}\r\n<\/pre>\n<p>It resides in the src\/Storefront\/Controller directory and is called EmizentechController. It is a class, that extends the Shopware 6 core class Shopware\\Storefront\\Controller\\StorefrontController.<\/p>\n<p>In case you needed a controller for the backend, you should extend Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController class.<\/p>\n<p>Our basic storefront controller contains one method, that gets called when the URL \/emizentech is loaded in the user\u2019s browser. To make this work, we need to add the <strong>\/src\/Resources\/config\/routes.xml<\/strong> file to our plugin\u2019s structure:<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;\r\n&lt;routes xmlns=\"http:\/\/symfony.com\/schema\/routing\"\r\n        xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n        xsi:schemaLocation=\"http:\/\/symfony.com\/schema\/routing\r\n        https:\/\/symfony.com\/schema\/routing\/routing-1.0.xsd\"&gt;\r\n    &lt;import resource=\"..&#047;..&#047;Storefront\/Controller\/**\/*Controller.php\" type=\"annotation\" \/&gt;\r\n&lt;\/routes&gt;\r\n<\/pre>\n<p>Now, we need to make sure that the controller is registered in the system, it is made public, and has the dependency injection container set to it. As usual, this is done in the <strong>services.xml<\/strong>:<\/p>\n<pre>      &lt;service id=\"EmizentechPlugin\\Storefront\\Controller\\EmizentechController\" public=\"true\"&gt;\r\n            &lt;call method=\"setContainer\"&gt;\r\n                &lt;argument type=\"service\" id=\"service_container\"\/&gt;\r\n            &lt;\/call&gt;\r\n        &lt;\/service&gt;\r\n<\/pre>\n<p>One last thing is left to be added, and we are ready to test the controller on the URL address \/emizentech on our Shopware 6 store. And this is precisely what our storefront controller is doing \u2013 rendering a page using a template.<\/p>\n<p>In our case, it is a sample twig template, named <strong>index.html.twig<\/strong>, located in the <strong>src\/Resources\/views\/storefront\/page\/emizentech<\/strong> directory:<\/p>\n<pre>{% sw_extends '@Storefront\/storefront\/base.html.twig' %}\r\n{% block base_content %}\r\n    &lt;h1&gt;Emizentech controller works!&lt;\/h1&gt;\r\n    {{ dump() }}\r\n{% endblock %}\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Shopware_6_Plugin_In_Adding_A_Migration\"><\/span>Shopware 6 Plugin In Adding A Migration:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>As we want our plugin to be portable, that\u2019s why we will add this code to the migration and make it a part of our plugin. Migration is a class that we can create manually like any other but, it is easier to use a command that is made specifically for this purpose. The command looks like this:<\/p>\n<p><strong>php bin\/console database:create-migration -p EmizentechPlugin &#8211;name EmizentechEntity<\/strong><\/p>\n<p>We will create a PHP file such as this in the src\/Migration directory within our plugin:<\/p>\n<pre>&lt;?php declare(strict_types=1);\r\n\r\nnamespace EmizentechPlugin\\Migration;\r\n\r\nuse Doctrine\\DBAL\\Connection;\r\nuse Shopware\\Core\\Framework\\Migration\\MigrationStep;\r\n\r\nclass Migration1621430431EmizentechEntity extends MigrationStep\r\n{\r\n    public function getCreationTimestamp(): int\r\n    {\r\n        return 1621430431;\r\n    }\r\n\r\n    public function update(Connection $connection): void\r\n    {\r\n\r\n        $connection-&gt;executeUpdate(\"\r\n            CREATE TABLE IF NOT EXISTS `emizentech_table` (\r\n                `id` BINARY ( 16 ) NOT NULL,\r\n                `name` VARCHAR ( 255 ) NOT NULL COMMENT 'Name',\r\n                `custom_fields` json DEFAULT NULL,\r\n                `created_at` datetime(3) NOT NULL,\r\n                `updated_at` datetime(3) DEFAULT NULL,\r\n                PRIMARY KEY ( `id` )\r\n            ) ENGINE = INNODB DEFAULT CHARSET = utf8;\r\n        \");\r\n\r\n    }\r\n\r\n    public function updateDestructive(Connection $connection): void\r\n    {\r\n        \/\/ implement update destructive\r\n    }\r\n}\r\n<\/pre>\n<p>This migration will be executed in the background when you will install your plugin. So, make sure you remove or edit it before you install your plugin because every migration will be executed just once!<\/p>\n<p>Now go to admin Settings &gt; System &gt; Plugins and install plugin After installation click on activate:<\/p>\n<p>Through the command line let\u2019s check whether this plugin is working or not:<\/p>\n<p><strong>php bin\/console emizentechplugin:emizentechcommand<\/strong><br \/>\nAnd, this is how the command is executed, its output looks like \u201cEmizentech command works\u201d:<\/p>\n<div class=\"center-imgs\"><a href=\"https:\/\/multisitelocal.ezxdemo.com\/enqiry.html?utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=emizen_blog\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" class=\"aligncenter\" src=\"\/blog\/wp-content\/uploads\/sites\/2\/2021\/05\/Build-Your-own-eCommerce-Store-with-Shopware.jpg\" alt=\"Hire Shopware developers\" \/><\/a><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Shopware_6_Plugin_In_Adding_An_Entity\"><\/span>Shopware 6 Plugin In Adding An Entity:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Let us create the entity definition first. This is where you will want to put the name of your table. The same name will be used when you will use the table as a repository.<\/p>\n<p>Creating a subdirectory \u201cEmizentechPlugin\/src\/Core\/Content\/EmizentechEntity\u201d and create Entity definition file <strong>EmizentechEntityDefinition.php<\/strong><\/p>\n<pre>&lt;?php declare(strict_types=1);\r\nnamespace EmizentechPlugin\\Core\\Content\\EmizentechEntity;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Field\\CreatedAtField;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Field\\UpdatedAtField;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\EntityDefinition;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Field\\CustomFields;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Field\\IdField;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Field\\StringField;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Field\\Flag\\PrimaryKey;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Field\\Flag\\Required;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\FieldCollection;\r\nclass EmizentechEntityDefinition extends EntityDefinition\r\n{\r\n    public const ENTITY_NAME = 'Emizentech_table';\r\n\r\n    public function getEntityName(): string\r\n    {\r\n        return self::ENTITY_NAME;\r\n    }\r\n\r\n    public function getCollectionClass(): string\r\n    {\r\n        return EmizentechEntityCollection::class;\r\n    }\r\n\r\n    public function getEntityClass(): string\r\n    {\r\n        return EmizentechEntity::class;\r\n    }\r\n\r\n    protected function defineFields(): FieldCollection\r\n    {\r\n        return new FieldCollection([\r\n            (new IdField('id', 'id'))-&gt;addFlags(new PrimaryKey(), new Required()),\r\n            new StringField('name', 'name'),\r\n            new CustomFields('custom_fields', 'customFields'),\r\n            new CreatedAtField(),\r\n            new UpdatedAtField()\r\n        ]);\r\n    }\r\n}\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Create_An_Entity_EmizentechEntityphp\"><\/span>Create An Entity EmizentechEntity.php:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Entity contains the setters and getters for its fields.<\/p>\n<pre>&lt;?php declare(strict_types=1);\r\nnamespace EmizentechPlugin\\Core\\Content\\EmizentechEntity;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\Entity;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\EntityIdTrait;\r\nclass EmizentechEntity extends Entity\r\n{\r\n    use EntityIdTrait;\r\n    \/**\r\n     * @var string\r\n     *\/\r\n    protected $name;\r\n    \/**\r\n     * @var array|null\r\n     *\/\r\n    protected $customFields;\r\n    public function getName(): string\r\n    {\r\n        return $this-&gt;name;\r\n    }\r\n    public function setName(string $name): void\r\n    {\r\n        $this-&gt;name = $name;\r\n    }\r\n    public function getCustomFields(): ?array\r\n    {\r\n        return $this-&gt;customFields;\r\n    }\r\n    public function setCustomFields(?array $customFields): void\r\n    {\r\n        $this-&gt;customFields = $customFields;\r\n    }\r\n}\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Create_an_Entity_collection_file_name_called_EmizentechEntityCollectionphp\"><\/span>Create an Entity collection file name called EmizentechEntityCollection.php:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Entity collection is the most simple of the three but, is the most important one.<\/p>\n<pre>&lt;?php declare(strict_types=1);\r\nnamespace EmizentechPlugin\\Core\\Content\\EmizentechEntity;\r\nuse Shopware\\Core\\Framework\\DataAbstractionLayer\\EntityCollection;\r\n\/**\r\n * @method void              add(EmizentechEntity $entity)\r\n * @method void              set(string $key, EmizentechEntity $entity)\r\n * @method EmizentechEntity[]    getIterator()\r\n * @method EmizentechEntity[]    getElements()\r\n * @method EmizentechEntity|null get(string $key)\r\n * @method EmizentechEntity|null first()\r\n * @method EmizentechEntity|null last()\r\n *\/\r\nclass EmizentechEntityCollection extends EntityCollection\r\n{\r\n    protected function getExpectedClass(): string\r\n    {\r\n        return EmizentechEntity::class;\r\n    }\r\n}\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Entity_Registration\"><\/span>Entity Registration:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The last thing we need to do if we want our new entity to work, is to register it in the services.xml file:<\/p>\n<pre>&lt;service id=\"EmizentechPlugin\\Core\\Content\\EmizentechEntity\\EmizentechEntityDefinition\"&gt;\r\n    &lt;tag name=\"shopware.entity.definition\" entity=\"Emizentech_table\" \/&gt;\r\n&lt;\/service&gt;\r\n<\/pre>\n<p>We hope this post helped you learn how to create a Shopware plugin. We at Emizentech can also help you in building a custom Shopware plugin as we are a leading <a href=\"https:\/\/multisitelocal.ezxdemo.com\/shopware-development.html\">Shopware development company<\/a> offering robust ecommerce solutions. So, whenever you need an expert Shopware developer please get in touch with us.<br \/>\n<strong>Source:<\/strong> <a href=\"https:\/\/shopwarian.com\/shopware-6-plugin-programming-tutorial\/\" target=\"_blank\" rel=\"noopener\">https:\/\/shopwarian.com\/shopware-6-plugin-programming-tutorial\/<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this article, we will create a sample plugin for Shopware 6. We will create a plugin through a minimal process, then after that will manually set up structures in Shopware6. Minimal Plugin Setup: After installing Shopware 6, go to directory path and run the command: php bin\/console plugin:create EmizentechPlugin Now, go to Admin and<\/p>\n","protected":false},"author":36,"featured_media":9373,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"MSN_Categories":"Uncategorized","MSN_Publish_Option":false,"MSN_Is_Local_News":false,"MSN_Is_AIAC_Included":"Empty","MSN_Location":"[]","MSN_Add_Feature_Img_On_Top_Of_Post":false,"MSN_Has_Custom_Author":false,"MSN_Custom_Author":"","MSN_Has_Custom_Canonical_Url":false,"MSN_Custom_Canonical_Url":"","_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[85],"tags":[84],"class_list":{"0":"post-9354","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-shopware","8":"tag-shopware"},"modified_by":"emizentech","featured_image_src":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-content\/uploads\/sites\/2\/2021\/05\/how-to-create-A-plugin-in-shopware-1.jpg","featured_image_src_square":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-content\/uploads\/sites\/2\/2021\/05\/how-to-create-A-plugin-in-shopware-1.jpg","author_info":{"display_name":"Vivek Khatri","author_link":"https:\/\/multisitelocal.ezxdemo.com\/blog\/author\/vivek"},"_links":{"self":[{"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/posts\/9354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/comments?post=9354"}],"version-history":[{"count":0,"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/posts\/9354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/media\/9373"}],"wp:attachment":[{"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/media?parent=9354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/categories?post=9354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/multisitelocal.ezxdemo.com\/blog\/wp-json\/wp\/v2\/tags?post=9354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}