it-swarm.com.de

Einen Beitrag aktualisieren, ohne das kaufmännische Und zu umgehen?

Ich habe festgestellt, dass wp_update_post() alle im post_content des Posts angegebenen kaufmännischen Und-Zeichen ignoriert. Ich versuche, einen Beitrag zu aktualisieren, ohne kaufmännisches Und in & zu konvertieren. (Ich muss Klartext-URLs (notlinks) zum Feld post_content der Beiträge hinzufügen.) Ich versuche also, eine Möglichkeit zu finden, wp_update_post() mit deaktivierter Escape-Funktion oder einer anderen Funktion an deren Stelle zu verwenden.

Ein Ansatz wäre, $wpdb direkt auszuüben, aber ich möchte lieber nicht, dass mir das als letzter Ausweg erscheint.

Eine Beobachtung, die ich gemacht habe, ist, dass, wenn Sie die "Text" -Ansicht verwenden, um einen Beitrag über die Admin-Oberfläche zu bearbeiten, Sie dem post_content erfolgreich kaufmännisches Und-Zeichen hinzufügen können, ohne dass sie in & konvertiert werden. Ich brauche jedoch einige Zeit, um den Code zu durchsuchen und herauszufinden, wie Wordpress dies erreicht. Weiß jemand, wie WP dies erreicht?

Letztendlich frage ich mich: Wie aktualisiere ich einen Beitrag am besten, wenn kaufmännisches Und "deaktiviert" ist?

2
rinogo

Das ist richtig, die Aktualisierung im Admin-Bereich ändert den & nicht in &, während die Funktion wp_update_post () (zu finden unter /wp-includes/post.php in Zeile 3772) dies nur dann tut, wenn Benutzer hat nicht die Fähigkeitungefiltertes_html, lassen Sie mich erklären, wie ich dies herausgefunden habe und was ich empfehle.

Ich habe ein bisschen nachgezeichnet und herausgefunden, dass wp_update_post () intern wp_insert_post () aufruft, wie in Zeile 3820 gezeigt

return wp_insert_post( $postarr, $wp_error );

wp_insert_post () ruft sanitize_post () in Zeile 3227 auf

$postarr = sanitize_post( $postarr, 'db' );

In Zeile 2176 ändert dieser Filter den & in &

$value = apply_filters( "{$field_no_prefix}_save_pre", $value );

Insbesondere gibt es einen Filter namens content_save_pre oder in meinem Fall title_save_pre, da ich das gleiche Problem mit dem Titel habe.

Nun auf die Admin-Seite, die /wp-admin/post.php verwendet

Sie können sehen, dass sich die aktuelle Speicherung in Zeile 205 befindet

$post_id = edit_post();

Die Funktion edit_post() finden Sie unter /wp-admin/includes/post.php in Zeile 208

function edit_post( $post_data = null ) {

Das eigentliche Update wird in Zeile 382 durchgeführt

$success = wp_update_post( $post_data );

Dies zeigt, dass Wordpress intern dieselbe Funktion wie wp_update_post () verwendet.

Es stellt sich heraus, dass es einen Filter mit dem Namen 'wp_filter_kses' gibt, der nicht von Wordpress Admin verwendet wird, der den Unterschied ausmacht. Sie können es zwar entfernen, indem Sie Folgendes verwenden:

remove_filter('content_save_pre', 'wp_filter_kses');

oder in meinem Fall

remove_filter('title_save_pre', 'wp_filter_kses');

Oder Sie können, wie in @rinogo erwähnt, kses_remove_filters () verwenden, um alle kses-Filter zu entfernen.

Diese Filter werden jedoch von /wp-includes/kses.php in Zeile 1934 gesetzt, nachdem überprüft wurde, ob der Benutzer die Fähigkeit "unfiltered_html" besitzt.

    if ( ! current_user_can( 'unfiltered_html' ) ) {
    kses_init_filters();
    }

Wenn kses_init_filters() aufgerufen wird, ist der Benutzer, der versucht, den Beitrag zu aktualisieren, nicht vertrauenswürdig genug und verfügt nicht über die erforderlichen Funktionen.

Ich würde empfehlen, dass die Authentifizierung richtig gehandhabt wird, anstatt die Filter zu entfernen.

1
Basil Banbouk

Ich bin nicht sicher, wie die Administrationsoberfläche von WP damit umgeht (z. B. das Szenario, auf das ich in der Frage verwiesen habe), aber ich habe einen Weg gefunden, dies zu erreichen:

//Disable KSES
kses_remove_filters();          

$update_rval = wp_update_post($updates);

//Reenable KSES
kses_init_filters();

Beachten Sie, dass "kses" -Funktionen Teil der Verteidigung von Wordpress gegen bösen Code sind. Verwenden Sie diesen Ansatz also auf eigenes Risiko. KSES macht einlotmehr als nur ein Escape-Zeichen. Wenn $updates vertrauenswürdige Daten enthält (wie in meinem Fall), sind Sie mit diesem Ansatz wahrscheinlich sicher.

0
rinogo