5

I have a plugin and I am creating a css file in wp_content.

I used this:

$this->content_dir = WP_CONTENT_DIR . "/some_folder";

$path = $this->content_dir . 'options.css';
$css='some string';
global $wp_filesystem; 
if(!$wp_filesystem->put_contents( $path, $css, 0644) ) {
    return __('Failed to create css file');
}

However I get this error:

Fatal error: Call to a member function put_contents() on a non-object

var_dump($css) return string.

Does put_contents write to an existing file or does it create a file like file_put_contents does?

I am looking for an equivalent of this:

if(!file_put_contents($path, $css)){
    return __('Failed to create css file');
};

Thank you!

5
  • 1
    My guess is that either $this or $wp_filesystem are not properly declared, as both of these should be calling other classes. Make sure you're calling the global $wp_filesystem; Jan 17, 2014 at 22:24
  • Yes, I do call global $wp_filesystem; just before I execute put_contents. Does put_contents write to an exisiting file or does it create a file like file_put_contents does?
    – Toniq
    Jan 17, 2014 at 22:39
  • Try var_dump($wp_filesystem);. What do you get?
    – s_ha_dum
    Jan 17, 2014 at 23:37
  • I have place this after I call global $wp_filesystem; and I get NULL. If I place WP_Filesystem(); I also get Fatal error: Call to undefined function WP_Filesystem()
    – Toniq
    Jan 18, 2014 at 0:04
  • Ok, I get it now, I call these in my add_shortcode function, so its executed in shortcode, which means its not an admin? What are my options?
    – Toniq
    Jan 18, 2014 at 0:11

2 Answers 2

9

Initialize the WP filesystem and no more using file_put_contents function. Try this:

[...]

global $wp_filesystem;
// Initialize the WP filesystem, no more using 'file-put-contents' function
if (empty($wp_filesystem)) {
    require_once (ABSPATH . '/wp-admin/includes/file.php');
    WP_Filesystem();
}

if(!$wp_filesystem->put_contents( $path, $css, 0644) ) {
    return __('Failed to create css file');
}
1
  • Have you tested that this works?
    – kaiser
    Sep 10, 2014 at 13:48
1
require_once( ABSPATH . 'wp-admin/includes/file.php' ); // you have to load this file

global $wp_filesystem;
$upload_dir = wp_upload_dir(); // Grab uploads folder array
$dir = trailingslashit( $upload_dir['basedir'] )  . 'cutomizer-css/'; // Set storage directory path
WP_Filesystem(); // Initial WP file system
$wp_filesystem->mkdir( $dir ); // Make a new directory folder if folder not their

$wp_filesystem->put_contents( $dir . 'news24-customize.css', $css, 0644 ); // Finally, store the file :D

Add above code in functions.php. After that enqueue that style

$uploads = wp_upload_dir();
wp_enqueue_style( 'newstweentyfour-customize', trailingslashit($uploads['baseurl']) . 'newstweentyfour-customize.css', array()  );

Its works i have tested..

3
  • It seems you posted same answer here
    – bravokeyl
    Sep 20, 2016 at 6:39
  • It would be great if you can explain as it answers OP, thanks :)
    – bravokeyl
    Sep 20, 2016 at 6:41
  • I update the code. please check it. Apr 3, 2017 at 6:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.