当‘COMMENT_CONTENT“在Excel CSV源数据中包含斜撇号时,我如何修复wp_INSERT_COMMENT错误

时间:2021-01-25 作者:CK MacLeod

为了将大量的用户响应从非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、 第一个传输/输出很好。第二个,在第二句中有一个倾斜的单引号,产生了我所描述的问题。带直引号的单元格传输良好。

Leveriza Abu Dhabi   NONE    United Arab Emirates    Abu Dhabi is one of the safest cities in the world. It is the capital of a developed country, which is the United Arab Emirates. The people/locals have a deep respect for their religion and culture herein. Abu Dhabi is a great place to visit or to reside for employment purposes.     8/5/2020 6:49:25    413912  Abu Dhabi, United Arab Emirates
Malak   Abu Dhabi   NONE    United Arab Emirates    Abu Dhabi is the capital of the UAE. It’s a very diverse city with a lot of beautiful places. It’s one of the wealthiest cities in the country, so it’s considered an expensive city. Compared to Dubai, it’s a more traditional city that has a lot to offer in terms of luxury.   8/8/2020 16:57:23   415450  Abu Dhabi, United Arab Emirates

完整代码:


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

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

如果处理为保存,则带有倾斜撇号/卷曲单引号的注释- - 只是没有插入-它们也不会出现在后端注释中。php或在post输出中。

那是因为wpdbchecks 如果注释内容包含任何无效(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,当前工作表)"选项,然后可能在下载文件后,您使用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文件导出的顺便说一句)

Easily convert file encoding using Notepad++ — Preview in a Windowws 10 computer

SO网友:CK MacLeod

我将此作为一个临时答案发布,但在我解决了一些新问题之前,我不会接受它。这些新问题是在我将300个测试行扩展到20000行的过程中出现的,或者是在我将测试行扩展到100000行的过程中出现的,并且出现了一些必须处理的新字符。如果有人能提供剩下的答案,或者更好的选择,那太好了,我会接受它而不是我自己的。如果没有,我会在有机会自己解决后再回来。

无论如何,对于特定站点和initial 数据,有效的是使用mb_convert_encoding() 以一种对源代码不可知的方式,然后用字符串替换我得到的坏字符。因此:

    $comment_content = mb_convert_encoding( $insert_array[4], \'HTML-ENTITIES\' ) ;  
    $comment_modified = str_replace( "�", "’", $comment_content ) ;
    
    $comment_data = array(
        
        \'comment_author\'    =>  ucfirst( $insert_array[0] ) ,
        \'comment_content\'   =>  $comment_modified,
        \'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],
    
        ), 

    ) ;  
背景:使用12年前PHP手动注释器中的函数-https://www.php.net/manual/en/function.mb-convert-encoding.php#86878 -, 我能够将注释全部处理为UTF-8编码,但得到了一个无效字符(在输出中呈现为Unicode“替换字符”);https://www.fileformat.info/info/unicode/char/fffd/index.htm).

然而,当我处理$comment_content 进入HTML实体� 返回然后在上运行str\\u replace()�, 具有’, 并且所有内容都按需要处理-至少300行。不幸的是,正如上面提到的,一个大得多的数据文件出现了额外的无效字符。

在不探讨世界范围内字符集的特殊历史的情况下,我只想说,在主要的英语语言中,单引号和双引号是用简单实体来表示的,但在其他广泛使用的字符集中,单引号和双引号是用另一个实体来表示的,还有一些字符集所共有的其他字符,在尝试将它们转换为标准英语字符集时会导致类似的问题。我还没有机会应用和比较不同的、可能更有效的方法(例如,在安装配置级别或通过内容过滤器功能)来处理底层问题。

相关推荐

I cannot view the comments

我最近开发了我的wordpress网站www.fingeroffury。com用于写博客。我已经贴了几篇博文,获得了评论。遗憾的是,这些评论并没有出现在个别帖子上。我已经在设置讨论和个人帖子中检查了所有必要的权限,但仍然没有显示这些权限。我还能错过什么?