it-swarm.com.de

WP Cron speichert weder <iframe> noch <object> im Post-Body

Ich verwende wp_cron, um Beiträge von einer entfernten Website automatisch zu erfassen und in meiner WP-Datenbank zu speichern.

HINWEIS! Ich führe meinen Code von meinem Plugin aus, nicht von meiner Vorlage functions.php oder anderswo. Ich habe meine eigene Validierung von erbeuteten Inhalten, um bösartigen Code usw. zu verhindern. Das Deaktivieren der Sicherheitsvalidierung in WordPress ist in meinem Fall kein Problem. Seien Sie jedoch vorsichtig, wenn Sie keine eigene Validierung von erbeuteten Inhalten haben. Validiere immer die erfassten Werte wenn möglich!

Ich habe in meinem Plugin eine Schaltfläche, um Beiträge manuell zu erfassen, indem ich auf diese Schaltfläche klicke, und es funktioniert perfekt. Alles wird so gespeichert, wie ich es möchte in meiner Datenbank. Kein Problem hier.

aber dann habe ich eine wp_cron Funktion, die alle zwei Minuten zu Testzwecken ausgeführt wird (wenn jemand auf meine Seite klickt, natürlich;) und hier ist ein Problem.

Beachten Sie, dass der Code identisch ist, nur anstelle von get_user_id() habe ich ihn manuell auf 1 gesetzt. Das ist wahrscheinlich die einzige Änderung zwischen diesen beiden Codes.

Und das Problem ist, dass alles wie erwartet gespeichert wird, einschließlich Zeit, Titel, Slug (es wird sogar erfasst und heruntergeladen und das Bild für den Beitrag richtig eingestellt), Tags, Kategorien und zusätzliche Taxonomie. Also das in Ordnung.

Es fehlt nur noch der Body-Text (Inhalt) des Posts.

Beim manuellen Download vom Administrator. Es ist so etwas wie:

<iframe width="650" scrolling="no" height="450" frameborder="0" src="http://example.com/embedframe/3843634"></iframe>

oder

<object height="450" width="650" ><param name="movie" ... bla bla bla ... shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" height="450" width="650" /></object> 

Also, weil es gefiltert und gestrippt ist, meine ich object und iframe, wenn Sie nicht als Administrator angemeldet sind?

Wenn ja, wie kann ich es in meinem Plugin ausschalten?

Oder ist es etwas anderes?

Ich denke wirklich, es ist nur etwas mit WP Sicherheitsproblem, weil der Code funktioniert, wenn von admin als admin manuell ausgeführt. Der Code der Funktion ist derselbe und alle Variablen werden wie erwartet übergeben. Nur der Inhalt wird nicht gespeichert.

EDIT:

Es ist definitiv etwas mit der WP Sicherheit . Wenn ich meine Inhaltsvariable für die automatische Cron-Funktion manuell auf "Testen der automatischen Speicherung" setze wird normal gespeichert. Aber wenn ich es auf <iframe>something</iframe> oder <object>blablabal</object> setze, ist es NICHT.

Wie kann ich diese "Prüfung" ausschalten, damit ich meinen Code mit cron speichern kann?

Irgendeine Idee?

2
Derfder

Anstatt die Sicherheitsfilter wie folgt manuell zu entfernen, sollten Sie einfach den richtigen Benutzer festlegen, unter dem diese Prozesse ausgeführt werden.

Wenn Sie angemeldet sind und einen Prozess manuell ausführen, sind Sie angemeldet , sodass Ihre Anmeldeinformationen und Ihre Berechtigungen verwendet werden. Ich wette, Sie sind Administrator auf der Website. Sie haben die Berechtigung, unfiltered_html zu veröffentlichen, dh Sie können iframes und Objekte veröffentlichen und was auch immer Sie möchten.

Wenn Ihr Cron-Job ausgeführt wird, sind Ihre Anmeldeinformationen nicht vorhanden. Daher erhält es nicht dieselben Berechtigungen. Dadurch werden die Sicherheitsfilter aktiviert und Dinge wie iframes und dergleichen werden blockiert.

Um dies zu beheben, müssen Sie Ihren Prozess ändern, um die Filter nicht zu deaktivieren, sondern um wie Sie auszuführen. Suchen Sie also Ihre Benutzer-ID-Nummer in der Datenbank und fügen Sie diesen Code hinzu, bevor Sie den Import ausführen:

wp_set_current_user( 123 );

Dabei steht "123" für Ihre Benutzer-ID. Dann ist der Code jetzt "Sie" und kann Dinge tun, wie Sie sie tun würden. Diese Filter werden nicht wirksam, da die Berechtigungen für den aktuellen Benutzer korrekt sind.

Hinweis: Dies ist nicht sicherer, übrigens. Sie erlauben immer noch einer entfernten Website, möglicherweise gefährliche Dinge in Ihre einzufügen. Sie vertrauen also darauf, dass sie Sie hier nicht verarschen. Denken Sie daran. Diese Methode ist einfacher als das manuelle Herumspielen mit Filtern.

2
Otto

ACHTUNG !!!

Validieren Sie immer die Daten, die Sie in der Datenbank speichern! Diese Antwort setzt voraus, dass Sie den Inhalt Ihres Posts innerhalb Ihrer benutzerdefinierten Funktion validieren, die Sie über cron auslösen!

Ich finde eine Lösung für dieses Problem des Entfernens von Iframe- und Objekt-Tags.

HINWEIS! Fügen Sie dies nur in den Funktionscode Ihres Plugins ein, der über wp cron ausgeführt wird. Gib es nicht in deine function.php in deiner Vorlage oder an anderen Stellen ein.

// before saving post
remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');

// save code here

// after saving post
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');

WICHTIG! Durch die Verwendung des Präfixes content_ beschränken wir die remove filter -> save our data -> add_filter-Prozesse auf den Inhalt und nicht auf Commetns, Auszüge usw.

1
Derfder

Nachdem ich alles versucht hatte, funktionierte das für mich:

global $allowedposttags;
$allowedposttags['div'] = array('align' => array (), 'class' => array (), 'id' => array (), 'dir' => array (), 'lang' => array(), 'style' => array (), 'xml:lang' => array() );
$allowedposttags['iframe'] = array('src' => array () );

https://wordpress.org/support/topic/wp_update_post-strips-css-id-attribute?replies=7

0
atwellpub

Verwenden Sie Shortcodes, z. B. erstellen Sie einen iframe-Shortcode, dann können Sie Folgendes tun:

[iframe]example.com[/iframe]

Hier ist Code, um einen solchen Shortcode zu implementieren:

add_shortcode('iframe', array('iframe_shortcode', 'shortcode'));
class iframe_shortcode {
    function shortcode($atts, $content=null) {
          extract(shortcode_atts(array(
               'url'      => '',
               'scrolling'      => 'no',
               'width'      => '100%',
               'height'      => '500',
               'frameborder'      => '0',
               'marginheight'      => '0',
          ), $atts));
          if (empty($url)) return '<!-- Iframe: You did not enter a valid URL -->';
     return '<iframe src="'.$url.'" title="" width="'.$width.'" height="'.$height.'" scrolling="'.$scrolling.'" frameborder="'.$frameborder.'" marginheight="'.$marginheight.'"><a href="'.$url.'" target="_blank">'.$url.'</a></iframe>';
    }
}

Verwendungszweck:

[iframe url="http://wpsnipp.com" width="100" height="100" scrolling="yes" frameborder="1" marginheight="2"]

Quelle:

http://wpsnipp.com/index.php/functions-php/iframe-shortcode-for-posts-and-pages/

Wenn Sie Objekteinbetten einfügen müssen, ist ein Fehler aufgetreten. Benutze OEmbed oder erstelle einen Shortcode

0
Tom J Nowell