为了将大量的用户响应从非WordPress转换为WordPress评论,我得到了一张Google表单。无论我使用何种方法将工作表转换为CSV文件(直接下载为CSV,下载为xlsx,然后另存为CSV,复制粘贴到Excel并保存),我都会得到一些相同问题的版本,尽管结果略有不同。
如果处理为保存,则带有倾斜撇号/卷曲单引号的注释-’
- 只是没有插入-它们也不会出现在后端注释中。php或在post输出中。
如果我在评论内容上使用esc\\u html(),将处理评论-将在后端和后期输出中列出-但评论内容will be emptied.
我尝试了其他一些方法以编程方式更改注释内容,如str\\u replace-ing’
具有\'
, 但我没有任何运气:受影响的评论仍然被拒绝。
其他在黑暗中拍摄的照片,如通过过滤器函数禁用wp\\U texturize(),都没有效果。
The one method that has worked so far has been to run a straight character replace - ’
with \'
- in the data files before saving as CSV and uploading. 对于将来需要不断更新的大型文件来说,这是次优的,我觉得应该有一个非常简单的编程解决方案。
首先,这里是我用于函数的代码的相关部分,我通过短代码运行,直到最初设置comment\\u数据为止。仅供参考,稍后添加post\\u id。(根据请求,我将添加更多的代码,并在末尾插入帖子和类别。)
$new_array = array() ;
if ( ( $handle = fopen( __DIR__ . "/sample_data.csv", "r" ) ) !== FALSE ) {
while ( ( $data = fgetcsv( $handle ) ) !== FALSE ) {
$new_array[] = $data ;
}
fclose( $handle ) ;
}
foreach( $new_array as $insert_array ) {
$comment_data = array(
\'comment_author\' => $insert_array[0] ,
\'comment_content\' => $insert_array[4] , //a string, see notes
\'comment_date\' => date( \'Y-m-d H:i:s\', strtotime( $insert_array[5] ) ),
\'comment_date_gmt\' => date( \'Y-m-d H:i:s\', strtotime( $insert_array[5] ) ),
) ;
}
重新陈述问题:如果我不做任何其他更改,那么所涉及的条目根本不会被添加,而其余的文件/行都已完成,并且使用直引号的条目将如预期的那样包含在输出中。
如需澄清,请重新提问/请求
每一行作为一个数组从csv文件中提取,每个单元格作为一个值。下面突出显示的单元格是两个典型的注释内容单元格-提取为连续的$insert_array[4]
\'s、 第一个传输/输出很好。第二个,在第二句中有一个倾斜的单引号,产生了我所描述的问题。带直引号的单元格传输良好。
完整代码:
add_shortcode( \'insert_from_db_file\', \'insert_from_db_file_handler\' ) ;
function insert_from_db_file_handler( $atts ) {
require_once( ABSPATH . \'/wp-admin/includes/taxonomy.php\');
$a = shortcode_atts( array(
\'test\'=> \'on\',
), $atts ) ;
$new_array = array() ;
if ( ( $handle = fopen( __DIR__ . "/sample_data.csv", "r" ) ) !== FALSE ) {
while ( ( $data = fgetcsv( $handle ) ) !== FALSE ) {
$new_array[] = $data ;
}
fclose( $handle ) ;
}
$i = 0 ;
foreach( $new_array as $insert_array ) {
$cats = array() ;
$state_id = $country_id = $state = $country = $post_id = \'\' ;
$i++ ;
if ( \'on\' == $a[\'test\'] && $i > 300 ) {
break ;
}
$comment_data = array(
\'comment_author\' => $insert_array[0] ,
\'comment_content\' => $insert_array[4] ,
\'comment_date\' => date( \'Y-m-d H:i:s\', strtotime( $insert_array[5] ) ),
\'comment_date_gmt\' => date( \'Y-m-d H:i:s\', strtotime( $insert_array[5] ) ),
\'comment_post_id\' => \'\',
\'comment_meta\' => array(
\'db_row\' => $insert_array[6],
\'standardized_location\' => $insert_array[7],
),
) ;
if ( ! get_page_by_title( $insert_array[1], OBJECT, \'city\' ) ) { // don\'t create new post if already exists
//create city categories
$country = \'NONE\' == $insert_array[3] ? \'\' : ucfirst( $insert_array[3] ) ;
$state = \'NONE\' == $insert_array[2] ? \'\' : ucfirst( $insert_array[2] ) ; //some lowercase in db
$country_id = wp_create_category( $country ) ;
$cats[] = $country_id ;
if ( $state ) {
$state_id = wp_create_category( $state, $country_id ) ;
$cats[] = $state_id ;
}
//create post
$post_arr = array(
\'post_title\' => ucfirst( $insert_array[1] ), //lowercase in some data
\'post_content\' => $insert_array[1],
\'post_status\' => \'publish\',
\'post_author\' => 3,
\'comment_status\' => \'closed\',
\'post_category\' => $cats,
\'post_type\' => \'city\'
) ;
$post_id = wp_insert_post( $post_arr ) ;
$args = array(
\'post_id\' => $post_id,
\'count\' => true,
) ;
$previous_comment = get_comments( $args ) ;
$comment_data[\'comment_post_ID\'] = $post_id ;
//add unique comments only
if ( ! $previous_comment ) {
$comment = wp_insert_comment( $comment_data ) ;
if ( ! $comment ) {
custom_logs( \'FALSE FOR \' . $i ) ;
custom_logs( print_r( $insert_array, true ) ) ;
}
}
$cities[] = $insert_array[1] ;
} else { //find city for comments
$db_rows = array() ; // don\'t accumulate gigantic db_rows?
$id = get_page_by_title( $insert_array[1], OBJECT, \'city\' )->ID ;
$args = array(
\'post_id\' => $id,
) ;
$previous_comments = get_comments( $args ) ;
foreach ( $previous_comments as $previous_comment ) {
$db_rows[] = get_comment_meta( $previous_comment->comment_ID, \'db_row\', true ) ;
}
if ( $previous_comments && ! in_array( $insert_array[6], $db_rows ) ) {
$comment_data[\'comment_post_ID\'] = $id ;
$comment = wp_insert_comment( $comment_data ) ;
if ( ! $comment ) {
custom_logs( \'FALSE FOR \' . $i ) ; //"custom_logs( $message )" is a utility function for debugging
custom_logs( print_r( $insert_array, true ) ) ;
}
}
}
}
return $i . \'COMMENTS INSERTED\' ;
}
最合适的回答,由SO网友:Sally CJ 整理而成
如果处理为保存,则带有倾斜撇号/卷曲单引号的注释-’
- 只是没有插入-它们也不会出现在后端注释中。php或在post输出中。
那是因为wpdb
班checks 如果注释内容包含任何无效(UTF-8)文本,如果是,则wpdb
拒绝内容,因此不运行插入查询(源于wp_insert_comment()
).
如果我在评论内容上使用esc\\u html(),评论将被处理-将在后端和后期输出中列出-但评论内容will be emptied.
与上述第一种情况类似,其中esc_html()
使用wp_check_invalid_utf8()
检查注释内容是否包含任何无效的UTF-8文本,如果是,则返回一个空字符串(默认情况下)。
我尝试了其他一些方法以编程方式更改注释内容,如str\\u replace-ing’
具有\'
, 但我没有任何运气:受影响的评论仍然被拒绝。
是的,因为你传给我的那句歪话str_replace()
注释内容中的倾斜引用不是相同的,即它们的编码不匹配,只是它们的外观相似。
因此。。。您可能只需要将文件编码转换为UTF-8
我的意思是,在上传文件之前转换它。:)你已经试过了吗?
或者,如果您使用的是Windows,那么您应该知道MS Excel默认情况下使用ANSI(即Windows-1252或西欧(Windows))编码保存CSV文件,因此您应该改为save it as UTF-8 — 在“中”;另存为“;窗口中,单击;“工具”;“旁边”;“保存”;按钮,选择;Web选项“;,然后转到;“编码”;选项卡并选择;Unicode(UTF-8)";。
无论我使用何种方法将工作表转换为CSV文件(直接下载为CSV,下载为xlsx,然后另存为CSV,复制粘贴到Excel并保存),我都会得到相同问题的某些版本
如果;直接下载为CSV“;,你是说文件→ 下载→ "E;逗号分隔值(.csv,当前工作表)"在Google Sheets(web)应用程序中的em>选项,然后可能在下载文件后,您使用MS Excel编辑并保存了它(编码设置为默认值)?
因为Google Sheets实际上是用UTF-8对工作表进行编码的(当导出工作表供下载时),所以如果您按原样(不编辑)将文件上载到您的网站,那么您就不会有编码问题。
如果您想确定编码是Windows-1252,请尝试其中一种(使用已上传的数据),如果编码确实是Windows-1252,则下面的第二和第三个将按原样给您倾斜的引号(即它在屏幕上的显示方式-’
), 而第一个会给你’
(而不是�
.. ).
$comment_content = mb_convert_encoding( $insert_array[4], \'HTML-ENTITIES\', \'Windows-1252\' );
$comment_content = mb_convert_encoding( $insert_array[4], \'UTF-8\', \'Windows-1252\' );
$comment_content = iconv( \'Windows-1252\', \'UTF-8\', $insert_array[4] );
或者实际上,如果您使用记事本++,那么您可以通过查看编辑器右下角来轻松检查编码。:)
更新实际上,当我说将其另存为UTF-8时,我的意思是,在Google Sheets中,将文件导出为Excel文件(.xlsx),然后在Excel中,将其导出为带有UTF-8编码的CSV。你是否试过这样做,或者你实际上是这样做的?
如果wp_insert_category()
工作,但不是wp_create_category()
, 那么很可能category_exists()
失败的原因可能有很多。。。
但无论如何,既然您知道了文件编码是什么(即Windows-1252),那么如果您无法让CSV数据工作,而不给您编码(或无效字符)问题,那么您可以尝试手动编码数据(即$insert_array
) 如UTF-8:
function my_fix_invalid_utf8( $text ) {
if ( function_exists( \'iconv\' ) ) {
return iconv( \'Windows-1252\', \'UTF-8\', $text );
} elseif ( function_exists( \'mb_convert_encoding\' ) ) {
return mb_convert_encoding( $text, \'UTF-8\', \'Windows-1252\' );
} elseif ( function_exists( \'utf8_encode\' ) ) {
// This would not fix the APPEARANCE of the text (i.e. you\'d see something like \'??\' on
// the page), but this would at least let you insert the comment or text to the database..
return utf8_encode( $text );
}
return $text; // if all else fails, return the text as-is
}
$insert_array = array_map( \'my_fix_invalid_utf8\', $insert_array );
我与记事本++的作者/开发人员没有任何关联,但实际上你可以使用记事本++轻松地转换编码。。那就试试吧?:)
(以下文件是从Excel文件导出的顺便说一句)