如何在WordPress的自定义输入域中存储带有Html代码的第三方脚本?

时间:2022-02-21 作者:Naren Verma

我在自定义帖子上创建了一个自定义字段。下面是我用于自定义字段的代码。

<?php 

function wpt_add_thirdpartyvideo_metaboxes() {
  add_meta_box(
    \'wpt_thirdpartyvideo_extra\',
    \'Information\',
    \'wpt_thirdpartyvideo_extra\',
    \'partyvideo\',
    \'normal\',
    \'default\'
  );  
}
add_action( \'add_meta_boxes\', \'wpt_add_thirdpartyvideo_metaboxes\' );

function wpt_thirdpartyvideo_extra() {
  global $post;
  // Nonce field to validate form request came from current site
  wp_nonce_field( basename( __FILE__ ), \'thirdpartyvideo_extra\' );
  // Output the field
  echo \'<table width="100%" border="0" cellspacing="0" cellpadding="10">
  <tr>
        <td>Video Script here </td>
        <td>
      <div class="form-check">
       <textarea name="thirdpartyvideoscript">\' . esc_textarea( get_post_meta( $post->ID, \'thirdpartyvideoscript\', true ) )  . \'</textarea>
       
      </div>
      </td>
        </tr>   
    </table>\';
}
function wpt_save_thirdpartyvideo_meta( $post_id, $post ) {
  if ( ! current_user_can( \'edit_post\', $post_id ) ) {
    return $post_id;
  }
  if ( ! isset( $_POST[\'thirdpartyvideoscript\'] ) ) {
    return $post_id;
  }

  $events_meta[\'thirdpartyvideoscript\'] = esc_textarea( $_POST[\'thirdpartyvideoscript\'] );
  
  foreach ( $events_meta as $key => $value ) :
    if ( \'revision\' === $post->post_type ) {
      return;
    }
    if ( get_post_meta( $post_id, $key, false ) ) {
      update_post_meta( $post_id, $key, $value );
    } else {
      add_post_meta( $post_id, $key, $value);
    }
    if ( ! $value ) {
      delete_post_meta( $post_id, $key );
    }
  endforeach;
}
add_action( \'save_post\', \'wpt_save_thirdpartyvideo_meta\', 1, 2 );

 ?>
我已经尝试添加一些虚拟内容,它正在工作。现在我必须添加第三方视频代码,即脚本和HTML标记,如下面的第三方示例所示。

<script src="//fast.wistia.com/embed/medias/s3lqfi0zn7.jsonp" async></script>
<script src="//fast.wistia.com/assets/external/E-v1.js" async></script>
<div class="wistia_embed wistia_async_s3lqfi0zn7" style="height:349px;width:620px">&nbsp;</div>
如果我添加上述代码,那么我将得到以下输出

&lt;script src=&quot;//fast.wistia.com/embed/medias/s3lqfi0zn7.jsonp&quot; async&gt;&lt;/script&gt;
    &lt;script src=&quot;//fast.wistia.com/assets/external/E-v1.js&quot; async&gt;&lt;/script&gt;
    &lt;div class=&quot;wistia_embed wistia_async_s3lqfi0zn7&quot; style=&quot;height:349px;width:620px&quot;&gt;&amp;nbsp;&lt;/div&gt;

1 个回复
SO网友:Bysander

您正在使用esc_textarea() 输出内容-所以它正是这样做的。

这当然是对用户输入的正确处理,因此这里有几个选项。

只要求嵌入id,然后在php中重建它。类似于:

<!-- Meta box input example -->
<input name="thirdpartyvideoscript" placeholder="eg. s3lqfi0zn7" />
<!-- expected input format is "s3lqfi0zn7" -->
<?php if ( ! empty( $meta_embed_value ) ) { // $meta_embed_value is your returned meta box (get_post_meta) ?>
    <script src="//fast.wistia.com/embed/medias/<?php echo esc_attr( $meta_embed_value ); ?>.jsonp" async></script>
    <script src="//fast.wistia.com/assets/external/E-v1.js" async></script>
    <div class="wistia_embed wistia_async_<?php echo esc_attr( $meta_embed_value ); ?>" style="height:349px;width:620px">&nbsp;</div>
<?php } ?>

<您可以使用正则表达式解构输入并匹配预期的输入,即允许将整个脚本粘贴到文本编辑区域,然后使用上面相同的代码以允许的安全格式打印匹配项。

把谨慎抛到九霄云外。。。让自己面对存储的XSS攻击,并进行不可思议的信任用户输入。如果我没有把自己说清楚的话,这不是一件好事。

相关推荐

如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: