Holen Sie sich benutzerdefinierte Feldwerte im Filter auf wp_insert_post_data

Lesezeit: 4 Minuten

Hallo alledanke fürs Lesen.


Umfeld :

WordPress + Plugin für erweiterte benutzerdefinierte Felder


Problem :

Ich habe jetzt stundenlang gesucht und kann anscheinend nicht die richtige Syntax finden, um Folgendes zu tun:

Wenn Sie einen neuen Beitrag veröffentlichen, erhalten Sie einen benutzerdefinierten Feldwert, um den Titel des Beitrags automatisch durch diesen Wert zu ersetzen. Beispiel: Ich erstelle einen Beitrag und stelle „10 Uhr“ in mein benutzerdefiniertes Feld „Uhrzeit“ ein. Der Titel des Beitrags wird automatisch durch „10 Uhr“ ersetzt.


Beispiel:

Also füge ich einen Filter mit folgendem hinzu:

add_filter('wp_insert_post_data', 'change_title') ;

function change_title($data)

{

    $time = XXX ; // How should I get this custom field value ?

    $new_title="Topic created at".$time ;

    $data['post_title'] = $time ;

    return $data;

}

Es muss sehr einfach sein, aber ich habe jede Funktion ausprobiert, die sowohl in WP als auch in der Dokumentation des Plugins verfügbar ist. Ich würde sehr dankbar wenn jemand vorbeikam, gab mir die Lösung.

Danke im Voraus !

Optimieren Sie Riadhs akzeptierte Antwort (würde als Kommentar hinzufügen, habe aber noch nicht genug Wiederholungen):

Wie dokumentiert in der WordPress-Codex wp_update_post beinhaltet die save_post Hook so ruft wp_update_post() innerhalb der save_post Hook erzeugt eine Endlosschleife. Um dies zu vermeiden, hängen Sie Ihre Funktion wie folgt aus und wieder ein:

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title="Topic created at ". $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}    

Benutzeravatar von Riadh C
Riad C.

Sie können tatsächlich auf die globale $_POST-Variable für Ihren Feldwert zugreifen, aber ich denke, Sie können dies auf sauberere Weise tun, indem Sie die Aktion save_post verwenden, um den Titel Ihres Beitrags zu aktualisieren, z.

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title="Topic created at ". $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}  

Angenommen, Ihr ACF-Feldname ist “Zeit”.

Bearbeiten: Die Antwort wurde gemäß der Antwort von Mark Chitty aktualisiert.

  • Funktioniert super, vielen Dank! Soweit ich weiß, aktualisieren wir, wenn ich Ihren Vorschlag richtig verstehe, den Post, nachdem er erstellt wurde, während ich in meinem versucht habe, ein benutzerdefiniertes Feld abzurufen, während der Post noch nicht erstellt wurde, richtig?

    – Malekith

    12. Februar 2014 um 3:19 Uhr


  • Dies führt zu einer Endlosschleife.

    – Stanley Wang

    14. Januar 2016 um 15:52 Uhr

Sie können dies versuchen

add_filter( 'wp_insert_post_data', 'change_title', '99', 2 );

function change_title($data , $postarr){

    $custom_field = 'custom_filed_name';
    $post_id = $postarr['ID'];
    $time = get_post_meta( $post_id, $custom_field, true );

    // Now you have the value, do whatever you want
}

  • Dadurch wird das benutzerdefinierte Feld für neu erstellte Beiträge nicht abgerufen. Es funktioniert nur, wenn ein bestehender Beitrag aktualisiert wird.

    – dritter

    13. Dezember 2015 um 5:58 Uhr

  • Ja wird es nicht, save_post ist ein geeigneter Haken, um das zu tun 🙂

    – Das Alpha

    13. Dezember 2015 um 18:22 Uhr


Benutzeravatar von treefiddy
baumfummelig

Erweiterte benutzerdefinierte Felder erstellt einen „Feldschlüssel“ für jedes erstellte benutzerdefinierte Feld. Ich konnte auf diesen Schlüsselwert verweisen, als ich versuchte, auf die benutzerdefinierten Felder zuzugreifen. Den Wert des Feldschlüssels finden Sie, indem Sie die Seitenquelle anzeigen, wenn Sie den Beitragstyp im WordPress-Admin-Bereich anzeigen.

Suchen data-field-key. Sie sehen einen ähnlichen Wert wie data-field-key="field_5847b00820f13" in der Seitenquelle. Verwenden Sie diesen Wert, wenn Sie auf den Wert in zugreifen $postarr Streit im wp_insert_post_data Filter. Die benutzerdefinierten Felder befinden sich in einem verschachtelten Array mit dem Namen fields innerhalb der $postarr Streit.

Alternativ kann der Feldschlüsselwert gefunden werden, indem Sie im Admin-Bereich zur Option „Erweiterte benutzerdefinierte Felder/Export“ navigieren. Sobald Sie sich auf der Exportseite für erweiterte benutzerdefinierte Felder befinden, wählen Sie die Option Export nach PHP und Sie sehen den Wert im resultierenden PHP-Code.

Im folgenden Beispiel verkette ich zwei erweiterte benutzerdefinierte Felder und aktualisiere die post_title in dem $data Von der Funktion zurückgegebenes Array.

Das Ergebnis ist, dass die post_title Der Wert wird über die in WordPress integrierte Postlogik zum Speichern in der Datenbank gespeichert.

add_filter('wp_insert_post_data', 'slb_set_title', '99', 2);

function slb_set_title ($data, $postarr){
  if($data['post_type']==='slb_subscriber'){
    $data['post_title'] = $postarr['fields']['field_5847b00820f13'] .' '.       
    $postarr['fields']['field_5847b03f20f14'];
  }
return $data;
}

1388140cookie-checkHolen Sie sich benutzerdefinierte Feldwerte im Filter auf wp_insert_post_data

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy