HTML-Entitäten werden nicht dekodiert, wenn die WordPress-REST-API für Gutenberg-Blöcke verwendet wird

Lesezeit: 2 Minuten

Benutzeravatar von codewithfeeling
CodemitGefühl

Ich baue einen benutzerdefinierten Gutenberg-Block, der eine Anfrage an die WordPress-REST-API stellt, um einige Beiträge zu erhalten. Ich benutze axios um die Anfrage an den REST-Endpunkt zu stellen.

Wenn das Ergebnis zurückkommt, gibt es ein Array von Post-Objekten, und ich kann die Titel der Posts sehen, aber sie sind alle im JSON-Objekt als enthalten title.rendered und enthalten HTML-Entitäten, z.

title: {
    rendered: "This has a hyphen – oh dear"
}`

Ich versuche, a zu füllen <SelectControl> mit den resultierenden Daten, so dass es keine Möglichkeit gibt, React zu verwenden dangerouslySetInnerHTML Methode, die das Problem der Entitäten lösen würde. Wie kann ich also diese Entitäten loswerden, wenn ich die Optionen ausfülle?

Hier ist der Code, den ich verwende, um die Optionen aus der REST-Antwort auszufüllen:

const options = response.data.map((post) => {
    return {
        label: post.title.rendered,
        value: post.id,
    };
});

Benutzeravatar von codewithfeeling
CodemitGefühl

Es ist nicht sofort offensichtlich, aber es gibt tatsächlich eine Methode, die in der Blocks-API zur Verfügung gestellt wird, um dies zu tun.

Geben Sie oben in Ihrem Blockcode Folgendes ein:

const { decodeEntities } = wp.htmlEntities;

Dann kannst du es so verwenden:

const options = response.data.map((post) => {
    return {
        label: decodeEntities(post.title.rendered),
        value: post.id,
    };
});

Panzerfaust! HTML-Entitäten sind weg.

  • In meinem Fall habe ich diese Zeile hinzugefügt: import {decodeEntities} from "@wordpress/html-entities"; nach Lauf npm install @wordpress/html-entities --save

    – Dudo1985

    3. November 2020 um 17:21 Uhr

  • Ja – das funktioniert perfekt, wenn Sie die @wordpress-Importe verwenden (ich verwende das auch) – ich werde das in die Antwort einfügen

    – CodemitGefühl

    3. November 2020 um 21:03 Uhr

Benutzeravatar von ZecKa
ZecKa

Und warum nicht verwenden rest_prepare_<post_type> filtern?

$post_type = "post";
add_filter( "rest_prepare_{$post_type}", 'prefix_title_entity_decode' );
function prefix_title_entity_decode( $response ) {
    $data = $response->get_data();
    $data['title']['rendered'] = html_entity_decode( $data['title']['rendered'] );
    $response->set_data( $data );
    return $response;
}

  • Sie sollten auch den neuen Titelwert durchgeben wp_kses_post()da es nicht maskierte Tags enthalten kann, die zu XSS-Schwachstellen führen können: $data['title']['rendered'] = wp_kses_post( html_entity_decode( $data['title']['rendered'] ) );

    – Wassilij Artamonow

    14. Juni um 6:59 Uhr


1387400cookie-checkHTML-Entitäten werden nicht dekodiert, wenn die WordPress-REST-API für Gutenberg-Blöcke verwendet wird

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

Privacy policy