web-dev-qa-db-ja.com

WP Cronは投稿の本文に<iframe>や<object>を保存しません

私はwp_cronを使用してリモートWebサイトから投稿を自動取得し、自分のwp dbに保存しています。

注意!テンプレートのfunctions.phpや他の場所ではなく、プラグインからコードを実行しています。私は、悪意のあるコードなどを防ぐために私自身が取得したコンテンツの検証を行っているので、WordPressのセキュリティ検証をオフにすることは問題になりませんが、取得したコンテンツを検証しない場合はご注意ください。可能ならばつかまれた値を常に検証しなさい!

私は自分のプラグインにこのボタンをクリックして手動で投稿をつかむためのボタンを一つ持っています、そしてそれは完璧に働きます。データベースには、必要なものすべてが格納されています。問題ありません。

しかし、その後2分ごとにテスト目的で実行されるwp_cron関数があり(もちろん、誰かが私のページをクリックした場合は)、これが問題です。

get_user_id()ではなく、コードが同一であることに注意してください。手動で1に設定しました。おそらくこれら2つのコード間の唯一の変更点です。

そして問題は、時間、タイトル、スラッグ(投稿のための注目の画像をつかんでダウンロードして正しく設定すること)、タグ、カテゴリーそして追加の分類法も含めて全てが期待通りに保存されることです。だから、それで結構です。

欠けているのは、投稿の本文(コンテンツ)だけです。

管理者から手動でダウンロードされたとき。それは次のようなものです。

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

または

<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> 

管理者としてログインしていない場合は、objectiframeを意味します。

もしそうなら、どのように私は私のプラグインでそれをオフにすることができますか?

それとも他の何か?

私は本当にWPセキュリティ問題を抱えているだけのものだと思います、なぜならコードはadminからadminとして手動で実行された時に機能するからです。そして関数のコードは同じで、すべての変数は期待通りに渡されます。内容だけは保存されません。

編集:

これは間違いなくWPセキュリティを持つものです。 auto cron関数の内容変数を手動で "Testing auto save"に設定したとき。正常に保存されます。しかし、私がそれを<iframe>something</iframe>または<object>blablabal</object>に設定したとき、そうではありません。

この "チェック"をオフにするにはどうすればいいですか?それでcronでコードを保存できますか?

何か案が?

2
Derfder

このように安全フィルタを手動で削除する代わりに、これらのプロセスが実行されるように正しいユーザーを設定する必要があります。

あなたがログインして手動でプロセスを実行しているとき、あなたはログインしているのであなたの資格が使われ、そしてあなたの許可が使われています。私はあなたがそのサイトの管理者であるに違いない。あなたはunfiltered_htmlを投稿する権限を持っています。つまり、iframeやオブジェクトを好きなように投稿できます。

あなたのcronジョブが実行されるとき、それはあなたの資格を持っていません。それで、それはそれらの同じ許可を得ません。したがって、セーフティフィルタが有効になり、iframeなどのものはブロックされます。

それを修正するには、フィルタを無効にするのではなく、自分のようにを実行するようにプロセスを変更する必要があります。データベースで自分のユーザーID番号を見つけ、インポートを実行するプロセスの直前に次のコードを追加します。

wp_set_current_user( 123 );

"123"はあなたのユーザーID番号です。そうすれば、コードは "あなた"になり、あなたがするのと同じように物事を実行することができます。現在のユーザーのアクセス許可が正しいため、これらのフィルタは有効になりません。

注:これは少しも安全ではない、BTW。あなたはまだいくつかのリモートWebサイトがあなたの上におそらく危険なものを挿入することを許可しています。だからあなたはここであなたを台無しにしないように彼らを信頼しています。それを心に留めておいてください。この方法は、手動でフィルタをいじるよりも簡単です。

2
Otto

警告!!!

データベースに保存しているデータを常に検証してください。以下の答えは、あなたがcronを介して起動したあなたのカスタム関数の中であなたがあなたの投稿の内容を検証すると仮定しています!

私はiframeとobjectタグを取り除くというこの問題の解決策を見つけます。

注意!これは、wp cronを介して実行されるプラグインの機能コードにのみ入れてください。あなたのテンプレートや他の場所のあなたのfunction.phpにそれを入れてはいけません

// 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');

重要!接頭辞content_を使用することで、remove filter -> save our data -> add_filterプロセスを内容だけではなく内容だけに制限しています。抜粋など.

1
Derfder

すべてを試した後、これは私のために働いた:

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

ショートコードを使用する、例えばiframeショートコードを作成すると、次のことができるようになります。

[iframe]example.com[/iframe]

そのようなショートコードを実装するためのコードは次のとおりです。

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>';
    }
}

使用法:

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

ソース:

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

オブジェクトの埋め込みを挿入する必要がある場合は、何か問題があります。 OEmbedを使うか、ショートコードを考案する

0
Tom J Nowell