Question

Nous avons la simple règle de prix catalogue qui est valable indéfiniment.

Dans notre flux Google Shopping qui est généré à minuit, la règle de prix ne s'applique pas.

Ma théorie est qu'il ya un petit laps de temps, où les prix calculés ne sont pas disponibles.

J'ai vérifié catalogrule_product_price - il semble y avoir que des prix calculés jusqu'à aujourd'hui (2013-04-22), de sorte qu'ils expirent à minuit:

mysql> select distinct rule_date from catalogrule_product_price;
+------------+
| rule_date  |
+------------+
| 2013-04-20 |
| 2013-04-21 |
| 2013-04-22 |
+------------+
3 rows in set (0.05 sec)

Est-ce normal? cron_schedule a des entrées récentes, donc je pense que le système est généralement en cours d'exécution Cron.

J'avais à l'esprit, que les règles de prix sont toujours générés plusieurs jours à l'avance, pour éviter de tels temps portées à des prix mal - Avais-je tort avec cette hypothèse? Qu'est-ce qui se passe ici?

EDIT: vérifié à nouveau aujourd'hui (2013-04-25) - même problème. Je voudrais vérifié hier pour voir si aussi 23, 24. et 25. où existants et donc les prix sont générés toujours en grappes ou arbre de si les prix sont toujours générés jusqu'à ce jour et trois jours en arrière.

mysql> select distinct rule_date from catalogrule_product_price;
+------------+
| rule_date  |
+------------+
| 2013-04-23 |
| 2013-04-24 |
| 2013-04-25 |
+------------+
3 rows in set (0.00 sec)
Était-ce utile?

La solution

Non.

Le travail cron appelle la méthode d'observation Mage_CatalogRule_Model_Observer::dailyCatalogUpdate(). Celui-ci appelle Mage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange() sans arguments.

Si applyAllRulesForDateRange() est appelée sans arguments, un jour +/- la date actuelle est utilisée.

Vous peut Créer des dates plus récentes ou plus, mais le travail de nuit Cron ne fonctionne pas.

Autres conseils

Je passe quelque temps à comprendre :)

Les prix de calculate de script pour le jour actuel , la veille et le lendemain .

Dans lequel, mises à jour incluent intervalle 3 jours [dans Magento 2.2.X]

  
      
  • jour en cours - 1 jours avant + 1 jour après
  •   

Mise à jour quotidienne règle de prix catalogue par Cron

  

/vendor/magento/module-catalog-rule/Cron/DailyCatalogUpdate.php

  • Mise à jour comprennent l'intervalle de 3 jours - jour en cours - 1 jours avant + 1 jour après
  • Cette méthode est appelée processus cron, Cron travaille à temps UTC et
  • nous devons générer des données pour l'intervalle -1 jours ... 1 jour

Réindexer prix des produits selon les paramètres de la règle.

  

/vendor/magento/module-catalog-rule/Model/Indexer/ReindexRuleProductPrice.php

public function execute(
    $batchCount,
    \Magento\Catalog\Model\Product $product = null,
    $useAdditionalTable = false
) {
    $fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
    $toDate = mktime(0, 0, 0, date('m'), date('d') + 1);

    /**
     * Update products rules prices per each website separately
     * because of max join limit in mysql
     */

    -
    -
    -

$ruleData['from_time'] = $this->roundTime($ruleData['from_time']);
$ruleData['to_time'] = $this->roundTime($ruleData['to_time']);
/**
 * Build prices for each day
 */
for ($time = $fromDate; $time <= $toDate; $time += IndexBuilder::SECONDS_IN_DAY) {
    if (($ruleData['from_time'] == 0 ||
            $time >= $ruleData['from_time']) && ($ruleData['to_time'] == 0 ||
            $time <= $ruleData['to_time'])
    ) {
        $priceKey = $time . '_' . $productKey;

        if (isset($stopFlags[$priceKey])) {
            continue;
        }

        if (!isset($dayPrices[$priceKey])) {
            $dayPrices[$priceKey] = [
                'rule_date' => $time,
                'website_id' => $ruleData['website_id'],
                'customer_group_id' => $ruleData['customer_group_id'],
                'product_id' => $ruleProductId,
                'rule_price' => $this->productPriceCalculator->calculate($ruleData),
                'latest_start_date' => $ruleData['from_time'],
                'earliest_end_date' => $ruleData['to_time'],
            ];
        } else {
            $dayPrices[$priceKey]['rule_price'] = $this->productPriceCalculator->calculate(
                $ruleData,
                $dayPrices[$priceKey]
            );
            $dayPrices[$priceKey]['latest_start_date'] = max(
                $dayPrices[$priceKey]['latest_start_date'],
                $ruleData['from_time']
            );
            $dayPrices[$priceKey]['earliest_end_date'] = min(
                $dayPrices[$priceKey]['earliest_end_date'],
                $ruleData['to_time']
            );
        }

        if ($ruleData['action_stop']) {
            $stopFlags[$priceKey] = true;
        }
    }
}
  

Ainsi, la durée de calcul

$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);
  

Dans Magento 1.X ce se produit si vous vivez dans un fuseau horaire qui   est plus que +01: 00 à l'heure GMT. Le cronjob par défaut est en cours d'exécution à 01:00   et utilise le temps GMT pour régler la rule_date. Dans ledit cas, la date sera   être « hier » alors il n'y aurait pas de règle de prix pour la journée en cours.

Exemple:

Current Datetime: 2017-07-19 01:00:00 (at current timezone)
Current Datetime at GMT: 2017-07-18 23:00:00
At 01:00 cronjob runs to write price rules with "$coreDate->gmtTimestamp('Today');"
Function will return "2017-07-18" which in this example is "yesterday"

Solution dans 2.2.X

  

/vendor/magento/module-catalog-rule/Model/Indexer/IndexBuilder.php

$fromTime = strtotime($rule->getFromDate());
$toTime = strtotime($rule->getToDate());
$toTime = $toTime ? $toTime + self::SECONDS_IN_DAY - 1 : 0;

Références

  1. http://www.divisionlab.com/solvingmagento/magento-catalog -Price règles /
  2. https://github.com/magento/magento2/issues/6610
  3. https: //ipfs-sec.stackexchange. cloudflare-ipfs.com/magento/A/question/3161.html
  4. https://support.google.com/merchants/answer/6069284? hl = fr
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top