WP_Query in meine eigene PHP-Datei aufnehmen?

7

Ich möchte einen Cronjob für mich selbst schreiben. Aber ich muss Zugriff auf WP_Queryund die Berechtigungen zum Löschen von Posts usw. erhalten.

Meine Frage ist nun, wie kann ich die WP_QueryFunktion in meine eigene PHP-Datei aufnehmen und muss ich einige Berechtigungen bearbeiten oder ändern, um Beiträge mit diesem Cronjob zu löschen oder zu erstellen?

Jan.
quelle

Antworten:

9

Laden Sie WordPress in ein benutzerdefiniertes PHP-Skript:

Sie müssen wichtige WordPress-Kernfunktionen in Ihr benutzerdefiniertes PHP-Skript laden WP_Query, damit es ordnungsgemäß funktioniert.

Angenommen, Sie haben eine benutzerdefinierte PHP-Datei mit dem Namen my-cron.phpund WordPress ist wie folgt im Webstamm installiert:

public_html/
    index.php
    my-cron.php <--
    wp-load.php
    wp-settings.php
    ...
    wp-admin/
    wp-content/
    wp-includes/

In diesem Setup, wenn Sie verwenden möchten , WP_Queryin my-cron.phpDatei, müssen Sie die laden wp-load.phpDatei. In der my-cron.phpDatei müssen Sie also den folgenden CODE haben:

if ( ! defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Zugriff auf WP_Query:

Zu diesem Zeitpunkt haben Sie Zugriff auf WP_Query, sodass Sie es folgendermaßen verwenden können:

// simply selecting posts with category name "wordpress"
$the_query = new WP_Query( array( 'category_name' => 'wordpress' ) );
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
}
else {
    echo "No post found for category named wordpress";
}

Beiträge löschen:

WP_Query hat jedoch keine Löschfunktion. Dafür müssen Sie entweder die wp_delete_post()Funktion oder die WPDBKlasse verwenden. Die Verwendung wp_delete_post()wird empfohlen, da viele Abhängigkeiten berücksichtigt werden. Wenn Sie jedoch mehr Kontrolle benötigen, können Sie eine WPDBKlasse oder eine $wpdbglobale Variable verwenden. Seien Sie jedoch vorsichtig, wenn Sie diesen Pfad auswählen.

Mit dem folgenden CODE wird beispielsweise der Beitrag mit der ID gelöscht 1:

$deleted = wp_delete_post( 1 );
if( $deleted === false ) {
    echo "Couldn't delete Post with ID=1";
}
else {
    echo "Deleted Post with ID=1";  
}

Natürlich können Sie kombinieren WP_Querymit wp_delete_postfinden und zu löschen Beiträge , dass erfüllen spezifische Kriterien.

Setup Cron:

Nachdem Sie das benutzerdefinierte PHP-Skript geschrieben haben, müssen Sie den Cron-Job so einrichten, dass er wie folgt als HTTP-Anforderung ausgeführt wird:

5 * * * * wget -q -O - http://your-domain.com/my-cron.php

Sicherheit:

Da für den Zugriff WP_Queryoder die wp_delete_postFunktion standardmäßig keine Authentifizierung (oder Berechtigung) erforderlich ist , müssen Sie sicherstellen, dass der Zugriff my-cron.phpnicht öffentlich möglich ist. Beispielsweise können Sie am Anfang der my-cron.phpDatei Folgendes hinzufügen , um nur Zugriff zu gewähren localhost:

$allowed_ip = '127.0.0.1';
if( $allowed_ip !== $_SERVER['REMOTE_ADDR'] ) {
    exit( 0 );
}
Fayaz
quelle
Gibt es eine andere Möglichkeit, alle meine Beiträge von der Seite zu durchlaufen product? - Weil mein Problem ist, ich diese Fehlermeldung:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8388616 bytes) in /var/www/vhosts/httpdocs/wp-includes/wp-db.php on line 1842
Jan
Es gibt viele andere Möglichkeiten, Sie können sogar benutzerdefinierte Abfragen ausführen. Aber zuerst müssen Sie herausfinden, was genau das Problem ist. Eine normale Abfrage sollte den Speicher nicht erschöpfen, es sei denn, Sie haben viele Beiträge. Ich schlage vor, Sie stellen eine weitere Frage mit dem von Ihnen verwendeten CODE.
Fayaz
0

Ist dies zum Löschen oder Erstellen von Websites in einer WordPress Multisite-Umgebung? In diesem Fall können Sie auf WP_Query zugreifen, um Websites zu verarbeiten, indem Sie die Funktion in eine PHP-Datei im Ordner eines netzwerkaktivierten Mu-Plugins einfügen.

Kinna T.
quelle
Nein, es ist eine normale Website
Jan
Sie möchten also einen Cronjob erstellen, um eine einzelne Site zu löschen?
Kinna T
Ja - das muss automatisiert werden. Aber ich brauche WP_Query für diese
Jan
Wenn Sie mit einer einzelnen Site arbeiten, können Sie keine WordPress-Abfrage erstellen, die eine gesamte einzelne Site erstellt oder löscht, da WordPress vollständig installiert / deinstalliert werden muss. Wenn Sie in einer Umgebung mit mehreren Standorten gearbeitet haben, gibt es Funktionen zum Erstellen und Löschen von im System integrierten Sites, die aufgerufen werden können.
Kinna T
Entschuldigung ... ich meine einen Cronjob, der Seiten löscht und nicht die ganze Seite!
Jan