FILE_GET_CONTENTS()是插件读取本地文件的唯一方法吗?还是WP_FilesSystem_Direct::GET_CONTENTS()可以工作?

时间:2020-03-27 作者:Jesse Steele

背景我正在开发plugin for WordPress. 我最初使用file_get_contents() 有两个目的:

远程文件(我改为wp_remote_post())

  • 插件目录中的一个本地文件(这个问题是关于什么的)
    1. WordPress工作人员告诉我不要使用file_get_contents() 对于远程_POST 请求(上述用法1),但要使用wp_remost_post() 相反

      来自他们关于用法1的电子邮件。(如上所述):

      在远程文件上使用file\\u get\\u内容

      许多主机阻止在远程内容上使用file\\u get\\u内容。这是一项我们完全赞同的安全措施。

      谢天谢地,WordPress提供了一个可替代的广泛HTTP API。它比大多数土生土长的替代品更快、更广泛。如果必须的话,它会退回到curl,但它首先会使用大量WordPress的本地功能。

      所以,我做到了。但是

      解决用法1。一个远程文件让我开始阅读并思考一个更好的使用工具。中的本地文件WordPress HTTP API docs,没有其他选择file_get_contents() 在本地文件上wp_file_get_contents().

      (我理解这可能看起来很奇怪,因为插件的本地文件通常是静态的,但我正在编写额外的文件以节省成本,我礼貌地不想打开讨论。此外,this approved plugin from someone else, code here, 使用file_get_contents(), 因此,证明我自己的需要是合理的,但它不能证明这一点file_get_contents() 是“适当的”WordPress实践。)

      从…起this blog post, 显然,这是一场重要的讨论file_get_contents() 对于远程文件。但是,我在网上没有看到多少关于本地文件的WordPress功能。发帖人:

      像许多其他人一样,我使用本机PHP函数file\\u get\\u contents()从远程文件接收内容,因为这些函数非常容易使用。但这是最好的方式吗?我看到很多脚本都在使用这个功能,甚至WordPress插件也在使用这个功能,而WordPress有一个本地功能来接收远程内容。

      。。。我想把这个讨论带到本地文件中,并正确构建这个插件。

      我的代码(当前和尝试的)

      我只需确认插件目录中是否存在本地文件,然后确认它是否包含特定字符串。我认为最好使用file_get_contents() 对于PHP中的本地文件this question on SE. 但是,这是WordPress。目前,我正在使用:

      if ( ( ! $wp_filesystem->exists ( $check_this_file ) )
       || (strpos ( file_get_contents ( $check_this_file ),
          $check_this_string ) === false ) )
      
      我试过使用WP_Filesystem_Direct::get_contents 而是:

      if ( ( ! $wp_filesystem->exists ( $check_this_file ) )
       || (strpos ( WP_Filesystem_Direct::get_contents ( $check_this_file ),
          $check_this_string ) === false ) )
      
      。。。但我有个错误:

      Deprecated: Non-static method WP_Filesystem_Direct::get_contents() should not be called statically

      我该怎么办

      我不确定,因为WP上甚至没有#get contents标签。SE,但该功能在框架和文档中都存在。

      我想知道;WordPress方式;对于要读取用于字符串测试的插件文件内容的插件:

      • file_get_contents() (我现在拥有的)WP_Filesystem_Direct::get_contents() (但我如何才能让它在没有错误的情况下工作?)proper-reliable使用wp_filesystem() 或类似产品

    2 个回复
    SO网友:Jesse Steele

    $wp_filesystem->get_contents()

    $wp_filesystem->get_contents() 已替换file_get_contents() 完全可以作为替代品。当然,它必须以WP_Filesystem(); 第一

    下面是一个前后示例。。。

    之前:

    if ( (strpos ( file_get_contents ( $check_this_file ),
        $check_this_string ) === false) ) {...}
    
    之后:

    WP_Filesystem();
    if ( (strpos ( $wp_filesystem->get_contents ( $check_this_file ),
        $check_this_string ) === false) ) {...}
    

    SO网友:Mohammad Mursaleen

    使用的替代品file_get_contents() 是启动WP_Filesystem 并使用其$wp_filesystem->get_contents 方法

    下面是一个关于如何使用它的清晰示例方法

    Example

    <?php
         /**
         * This method gets a list of the most popular Google web fonts. 
         * Initialize the WP filesystem and no more using file_put_contents function
         *
         * @see     wp_filesystem()
         * @see     get_parent_theme_file_path()
         * @return  array   A list of Google web fonts
         */
        function mm_get_google_fonts() {
     
        // Call globals
        global $wp_filesystem;
    
        // You have to require following file in the front-end only. In the back-end; its already included
        require_once ( ABSPATH . \'/wp-admin/includes/file.php\' );
    
        // Initiate
        WP_Filesystem();
         
        $local_file =   get_parent_theme_file_path( \'/assets/json/google-web-fonts.json\' );
        $content    =   \'\';
     
        if ( $wp_filesystem->exists( $local_file ) ) {
    
            // following is alternate to
            // $content = json_decode( file_get_contents( $local_file ) );
    
            $content = json_decode( $wp_filesystem->get_contents( $local_file ) );
    
        } // End If Statement
     
        return $content;
     
    } 
    ?>
    
    有关更多信息,您可以visit the official documenation of WP_Filesystem

    相关推荐