Certo, pergunta tão antiga, mas relevante para mim. Infelizmente, não havia uma resposta, então eu tive que corrigi-lo pessoalmente e acho que vou responder à pergunta enquanto estou nisso.
Documentarei o trabalho aqui, mas o módulo inteiro está disponível em https://github.com/rianorie/magento2-sortcatalogwidget .
Primeiramente, eu procurei no módulo catalogwidget no Magento e encontrei \Magento\CatalogWidget\Block\Product\ProductsList::createCollection
. O que confirma que não há funcionalidade de classificação disponível. Então, vem um plug-in:
class AfterCreateCollection
{
public function aftercreateCollection($subject, $result)
{
/**
* @var \Magento\Catalog\Model\ResourceModel\Product\Collection $result
* @var \Magento\CatalogWidget\Block\Product\ProductsList $subject
*/
// if there's a sort_by attribute defined, add a sort to the collection
if ($subject->hasData('sort_by')) {
// if there's a direction given, check and use that otherwise use the default
$direction = strtoupper($subject->getData('sort_direction'));
if (!in_array($direction, [Select::SQL_DESC, Select::SQL_ASC])) {
$direction = Select::SQL_DESC;
}
$result->setOrder($subject->getData('sort_by'), $direction);
}
return $result;
}
}
Este é um bom começo, mas o administrador não permite adicionar atributos manualmente a uma definição de widget com muita facilidade. Então, adicionamos uma definição para isso também.
Em etc/widget.xml
nós fazemos:
<?xml version="1.0" encoding="UTF-8"?>
<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget.xsd">
<widget id="products_list">
<parameters>
<parameter name="sort_by" xsi:type="text" required="false" visible="true">
<label translate="true">Attribute to sort the products by</label>
</parameter>
<parameter name="sort_direction" xsi:type="select" visible="true" required="false"
source_model="Elastomatic\SortCatalogWidget\Model\Config\Source\Direction">
<label translate="true">Sort direction</label>
</parameter>
</parameters>
</widget>
</widgets>
Aaand voila! A classificação para o widget de catálogo agora é possível. Eu posso adicionar um menu suspenso para o campo de atributo do produto em vez da entrada de digitação livre no módulo em algum momento, mas isso serve ao meu propósito no momento.