it-swarm.com.de

Was sind die Einschränkungen von wp_update_post ()?

Ich habe zwei Felder in der Tabelle wp_posts, die wp_update_post() anscheinend nicht ändern kann. Ich versuche den folgenden Code zu verwenden:

$echo $group_access;
$echo $tag_list;
$my_post = array(
      'ID'           => 12095, 
      'post_title'   => 'Test Title',
      'post_content' => 'Test Content',     
      'group_access' => $group_access,
      'tag_list'     => $tag_list,
  );
// Update the post into the database
$post_id = wp_update_post( $my_post, true );

if (is_wp_error($post_id)) {
    $errors = $post_id->get_error_messages();
    foreach ($errors as $error) {
        echo $error;
    }
}

Die Variablen $group_access und $tag_list geben die korrekten Werte wieder. Der post_title und der post_content werden korrekt aktualisiert. group_access und tag_list werden nicht aktualisiert, und es liegt auch kein Fehler vor.

Natürlich habe ich die Tabelle überprüft und group_access und tag_list sind die richtigen Spaltenüberschriften.

Ich bin ratlos, warum es nicht funktioniert. Kann wp_update_post() keine Spalten ändern, die nicht Teil der Standardinstallation von WP sind? Handelt es sich möglicherweise um einen Datentyp (z. B. sollte ich ein Array oder eine Ganzzahl übergeben, aber ich übergebe eine Zeichenfolge)?

4
fredsbend

Du hast Recht; WordPress aktualisiert keine benutzerdefinierten Datenbankspalten mit wp_update_post() oder wp_insert_post(). Ziehen Sie die Verwendung von Post-Meta- und/oder Taxonomie-APIs in Betracht, anstatt benutzerdefinierte Datenbankspalten zu erstellen.

Wenn Sie die wp_posts -Tabelle ändern müssen, müssen Sie Ihre benutzerdefinierten Spalten selbst aktualisieren. Möglicherweise treten Probleme mit verschiedenen anderen Plug-ins auf, die die benutzerdefinierten Datenbankspalten nicht berücksichtigen.

3
Dave Romsey

wp_insert_post_data wird fast unmittelbar vor dem Einfügen der Post-Daten in die Datenbank ausgelöst. Das einzige, was danach passiert, ist, dass die $ -Daten wp_unslash() sind. Sie sollten in der Lage sein, diesen Filter zu verwenden, um das von Ihnen gesendete $ postarr wp_update_post mit dem an diesen Filter übergebenen $ postarr zu vergleichen. Wenn sich die beiden unterscheiden, können Sie die $ -Daten formatieren, bevor sie in die Datenbank eingefügt werden.

Ich habe das schnell verspottet. Ich habe es nicht getestet, aber es sollte mit geringfügigen Änderungen funktionieren.

In class-wpse-258786.php:

class wpse_258786 {
  protected $postarr;
  public function __construct( $postarr ) {
    $this->postarr = $postarr;
  }
  public function insert_post_data( $data, $postarr ) {
    //* Make sure this is added each time before each post
    remove_action( 'wp_insert_post_data', [ $this , 'insert_post_data' ] , 10 );

    if( $postarr !== $this->postarr ) {
      //* Format the $data to insert into table
    }
    return $data;
  }
}

in deiner-file.php

include_once( PATH_TO . 'class-wpse-258786.php' );

...

$echo $group_access;
$echo $tag_list;
$my_post = array(
      'ID'           => 12095, 
      'post_title'   => 'Test Title',
      'post_content' => 'Test Content',     
      'group_access' => $group_access,
      'tag_list'     => $tag_list,
  );

//* Filter the post data before inserting into database
add_action( 'wp_insert_post_data',
  [ new wpse_258786( $my_post ), 'insert_post_data' ], 10, 2 );

// Update the post into the database
$post_id = wp_update_post( $my_post, true );

Bearbeiten zum Hinzufügen: Ich würde die Klasse in eine separate Datei einfügen, sie einmal einfügen und dann den Filter zur Klasse hinzufügen. Dann, kurz bevor Sie wp_update_post(), fügen Sie den Filter mit den Post-Daten im Konstruktor hinzu. Wenn der Haken ausgelöst wird, können Sie den Filter entfernen, um sicherzustellen, dass er nicht mehr als einmal ausgelöst wird.

Als Antwort auf Ihren Kommentar können Sie could $ wpdb verwenden, und genau so funktioniert wp_insert_post(). Das Tolle an der Verwendung der wp_insert_post()-Abstraktion ist, dass sie viele Aktionen und Filter-Hooks einführt, mit denen wir die Daten ändern können, bevor sie in die Datenbank eingegeben werden. Überprüfen Sie die Funktion wp_insert_post() in trac.

2
Nathan Johnson