Creating a New Shipping Method In Magento 2
Configuring custom shipping methods is essential for stores that deliver physical products. This guide walks you through building a complete custom shipping method in Magento 2.
Summary
- Step 1: Create a Custom Module
- Step 2: Create the System Configuration
- Step 3: Add Default Config Values
- Step 4: Create the Shipping Model
Step 1: Create a Custom Module
Create the module declaration files:
module.xml
<?xml version="1.0"?>
<module name="Hikmadh_Shipping" setup_version="1.0.0">
<sequence>
<module name="Magento_Shipping"/>
</sequence>
</module>
registration.php
<?php
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Hikmadh_Shipping',
__DIR__
);
Enable Module
php bin/magento setup:upgrade
Step 2: Create System Configuration (Admin Form)
Create system.xml file:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/system_file.xsd">
<system>
<section id="carriers">
<group id="hikmadh_shipping">
<label>Hikmadh Custom Shipping</label>
<field id="active" type="select">
<label>Enabled</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="title" type="text">
<label>Title</label>
</field>
<field id="name" type="text">
<label>Method Name</label>
</field>
<field id="price" type="text">
<label>Shipping Price</label>
</field>
</group>
</section>
</system>
</config>
Step 3: Create config.xml (Default Values)
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/config.xsd">
<default>
<carriers>
<hikmadh_shipping>
<active>1</active>
<title>Hikmadh Shipping</title>
<name>Custom Shipping Method</name>
<price>20.00</price>
</hikmadh_shipping>
</carriers>
</default>
</config>
Step 4: Create Shipping Model
<?php
namespace Hikmadh\Shipping\Model\Carrier;
use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Shipping\Model\Rate\ResultFactory;
use Magento\Shipping\Model\Rate\Result\MethodFactory;
class Custom extends \Magento\Shipping\Model\Carrier\AbstractCarrier
{
protected $_code = 'hikmadh_shipping';
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
ResultFactory $rateResultFactory,
MethodFactory $rateMethodFactory,
array $data = []
) {
$this->rateResultFactory = $rateResultFactory;
$this->rateMethodFactory = $rateMethodFactory;
parent::__construct($scopeConfig, $data);
}
public function collectRates(RateRequest $request)
{
if (!$this->getConfigFlag('active')) {
return false;
}
$result = $this->rateResultFactory->create();
$method = $this->rateMethodFactory->create();
$method->setCarrier($this->_code);
$method->setCarrierTitle($this->getConfigData('title'));
$method->setMethod($this->_code);
$method->setMethodTitle($this->getConfigData('name'));
$price = $this->getConfigData('price');
$method->setPrice($price);
$method->setCost($price);
$result->append($method);
return $result;
}
public function getAllowedMethods()
{
return [$this->_code => $this->getConfigData('name')];
}
}
Final Step: Flush Cache
php bin/magento cache:flush