2017-11-22 2 views
5

Ich erhalte dies in Fehlerprotokolle, wann immer ein Cron läuft, um Abonnements für meinen Client automatisch zu erneuern.WooCommerce Fehlendes Argument 1 für WC_Subscriptions_Manager :: prepare_renewal()

[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: Stack trace:, referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #0 [internal function]: WC_Subscriptions_Payment_Gateways::gateway_scheduled_subscription_payment(), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #1 /var/home/hybrid/completehumanperformance.com/www/wp-includes/class-wp-hook.php(298): call_user_func_array('WC_Subscription...', Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #2 /var/home/hybrid/completehumanperformance.com/www/wp-includes/class-wp-hook.php(323): WP_Hook->apply_filters('', Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #3 /var/home/hybrid/completehumanperformance.com/www/wp-includes/plugin.php(515): WP_Hook->do_action(Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #4 /var/home/hybrid/completehumanperformance.com/www/wp-cron.php(117): do_action_ref_array('woocommerce_sch...', Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #5 {main}, referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: thrown in /var/home/hybrid/completehumanperformance.com/www/wp-content/plugins/woocommerce-subscrip..., referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000 

Zusammenfassung: Missing argument 1 for WC_Subscriptions_Manager::prepare_renewal()

ich die cron erstellt haben ein Plugin namens WP_Crontrol, mit hook_name: woocommerce_scheduled_subscription_payment.

in der WP Crontrol Panel, haben Sie eine Option, um Argumente übergeben - Ich habe versucht, $subscription_id (das ist, was der Code fragt), aber es hat nichts getan.

Die Frage ist also - wie kann ich diesen Cron-Job erhalten, alles in der db zu verarbeiten? Welches bisschen Konfiguration fehlt mir?

Dank

HAFTUNGSAUSSCHLUSS: Ich erbte dieses von einem Kunden, der sie auf ihren eigenen Aufrechterhaltung hatte. So war es, als ich hier ankam, guv!

+0

Könnten Sie uns bitte zeigen, wie Sie den Hook "woocommerce_scheduled_subscription_payment" implementiert haben? – dferenc

Antwort

2

Gemäß den WooCommerce Subscriptions Manager Git Repo, dies ist die Funktion, die es auszuführen versucht:

/** 
* Sets up renewal for subscriptions managed by Subscriptions. 
* 
* This function is hooked early on the scheduled subscription payment hook. 
* 
* @param int $subscription_id The ID of a 'shop_subscription' post 
* @since 2.0 
*/ 
public static function prepare_renewal($subscription_id) { 
    $order_note = _x('Subscription renewal payment due:', 'used in order note as reason for why subscription status changed', 'woocommerce-subscriptions'); 
    $renewal_order = self::process_renewal($subscription_id, 'active', $order_note); 
    // Backward compatibility with Subscriptions < 2.2.12 where we returned false for an unknown reason 
    if (false === $renewal_order) { 
     return $renewal_order; 
    } 
} 

Sie sind von diesem sehen können, dass es einen Parameter empfangen muß, die eine ganze Zahl und haben zu einem entsprechen Shop-Abonnement-ID

Es gibt also ein paar Dinge, die Sie tun wollen, um dies richtig zu lösen. Ich gehe davon aus, dass Sie nicht zu sehr in das Debuggen von Befehlszeilen eindringen wollen, damit Sie nicht versehentlich Cron-Jobs auslösen, die möglicherweise die Dinge auf unerwartete Weise ändern (normalerweise eine gute Idee, wenn vermeidbar, besonders wenn es dazu gehört) Geld anderer Leute).

  • Erstens, stellen Sie sicher, dass Ihr Fehlerprotokoll mit define('WP_DEBUG_LOG', true);
  • Zweitens aktiviert ist, müssen Sie den Wert von $subscription_id loggen sein, wie es existiert, wenn es um den Job übergeben wird.

So etwas wie dies im woocommerce_scheduled_subscription_payment Haken:

error_log(sprintf('Parameter [%s] with type [%s] is the [$subscription_id], as passed to the job: [%s]', (string) $subscription_id, gettype($subscription_id), 'WC_Subscriptions_Manager::prepare_renewal')); 

Dies sollte die ID aufzuheben, das wird übergeben wird und es in Ihrem Fehlerprotokoll. Warten Sie als Nächstes, bis der Job erneut ausgeführt oder manuell ausgeführt wird.

Nachdem der Auftrag ausgeführt wurde, müssen Sie die folgenden Dinge überprüfen:

  • Die Nachricht in Ihrem log (duh) nach oben zeigte
  • Der Wert von $subscription_id eine ganze Zahl ist, und nicht leer ist oder falsch.
  • Der Wert $subscription_id entspricht einer gültigen shop_subscription Beitrags-ID in Ihrer Datenbank.

Dies ist wahrscheinlich in Ihrem posts Tisch, aber Woo ist bekannt, dass einige squirrelly Dinge in der Datenbank gelegentlich zu tun, also wenn Sie es nicht in posts finden können, dann eine Abfrage wie die folgenden verwenden, es zu finden :

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME = 'shop_subscription' 
    AND TABLE_SCHEMA='YourDatabase'; 

Sie oben etwas mit dem muß Geige kann es bekommen haben das rechte Feld, sondern zwischen PhpMyAdmin oder einem anderen MySql Visualisierungen Werkzeug und Abfragen INFORMATION_SCHEMA.COLUMNS, Sie sollten nicht so schwer von einer Zeit, zu finden.

Vorausgesetzt, dass angezeigt wird, haben Sie bestätigt, dass Sie eine gültige ID übergeben. Wenn der Fehler also noch nicht behoben ist, besteht der nächste Schritt darin, die tatsächliche Woo-Funktion zurückzuverfolgen und herauszufinden, warum der Wert nicht angegeben wird.

Dies ist in Wordpress Einbauten ein wenig zu graben, so stellen Sie sicher, dass Sie Ihre Website sichern, bevor Sie dies mit Git oder einer TAR-Datei oder etwas tun, damit Sie keine Hacks im Kern oder Plugin. Wenn das Problem weiterhin besteht, führen Sie an dieser Stelle eine Sicherungskopie aus, bevor Sie fortfahren.


Das nächste, was (vorausgesetzt, Sie haben das eigentliche Problem noch nicht gefunden) in die WC_Subscriptions_Manager::prepare_renewal Funktion gehen und zwei Dinge melden Sie sich von dort aus (siehe den Repo-Link am Anfang der Antwort navigate zu helfen) . Sie möchten print_r(debug_backtrace(), 1) loggen, um das vollständige Backtrace von Woo rückwärts zu protokollieren (das wird groß sein, lassen Sie es nicht dort, nachdem Sie fertig sind, es sei denn, Sie mögen massive Protokolldateien, die Ihren gesamten Festplattenspeicher überladen).

Sie möchten auch direkt in diese Methode den Wert $subscription_id loggen, um sicherzustellen, dass es den gleichen Wert ist, den es bestanden hat.

Aus der Optik Ihres Fehlers scheint es, dass es überhaupt nicht übergeben wird. Das bedeutet höchstwahrscheinlich, dass Sie ein null Ergebnis von der Datenbank oder dem Hook erhalten haben, und Ihr Problem sollte im ersten Teil dieser Diagnose gelöst werden. Der zweite Teil ist eine Redundanz, um sicherzustellen, dass Sie das Problem tatsächlich behoben haben.

  • Der Job muss für jeden Schritt ausgeführt werden, der den Code ändert. Warten Sie auf die nächste Ausführung, führen Sie sie manuell aus oder führen Sie einen Dry-Run durch, wenn dies bei der Fehlersuche hilfreich ist.

Wenn der vorherige Entwickler das Woo-Plugin gehackt, können Sie git verwenden, um alle seine Änderungen, indem Sie die folgenden ziemlich leicht zu isolieren:

cd /path/to/plugin 
git init 
git add --all 
git remote add origin [email protected]:wp-premium/woocommerce-subscriptions.git 
git commit 
git pull 

dann git diff einer der Commits einer stabilen Veröffentlichung von die GitHub-Seite. Alle Änderungen werden in der diff

angezeigt Dies sollte schnell debuggen den Job abdecken, und isoliert auch alle anderen Restprobleme, die Sie möglicherweise von dem vorherigen Entwickler übrig haben, die Sie vielleicht noch nicht einmal bewusst sind.

+0

Ich bin nicht sicher, welche Version von 'WC_Subscriptions_Manager' Sie verwenden, aber die meisten gut strukturierten Git-Repos verwenden Tags, die einem Versions-Release entsprechen. Daher sollten Sie überprüfen, welche Version Sie haben, das Repo für das entsprechende Tag überprüfen und' git diff 'gegen dieses Commit, um alle Core-Entwickler-Änderungen als falsche Flags im diff auszuschließen. – mopsyd

+0

Hallo, und danke für die große Anstrengung. Ich hätte es klarer machen müssen - ich habe eine lokale Kopie von WordPress auf meinem Mac, mit phpstorm als mein Debugger, und eine Kopie der Kunden-Datenbank hier. Ich fürchte, all diese Beschreibung von Logging und so weiter wird durch die Möglichkeit, die Variablen direkt zu inspizieren und den gesamten Backup des Stacks auf wp_cron.php zu sichern, ersetzt. Die subscription_id wird einfach nie übergeben. – WeeDom

+0

Hast du die Subscription_id zumindest im Hook verfügbar, oder geht es nicht so weit? – mopsyd

Verwandte Themen