Tag Archives: plugins

How to save a string to a local file in PHP?

Αυτή η ανάρτηση είναι η δεύτερη στη σειρά geek μου,,en,Κατά τον προγραμματισμό του Theme Tweaker μου,,en,Βρήκα αυτό το πρόβλημα,,en,Είχα μια συμβολοσειρά στο διακομιστή μου στο πρόγραμμα php μου,,en,το τροποποιημένο φύλλο στυλ,,en,και ήθελα να δώσω στον χρήστη την επιλογή να το αποθηκεύσει σε ένα αρχείο του υπολογιστή του,,en,Θα νόμιζα ότι αυτό ήταν ένα κοινό πρόβλημα,,en,και όλα τα κοινά προβλήματα μπορούν να επιλυθούν με το Googling,,en,Ιδού,,en,Δεν μπορούσα να βρω μια ικανοποιητική λύση,,en,Βρήκα το δικό μου,,en,και σκέφτηκα να το μοιραστώ εδώ,,en,προς όφελος όλων των μελλοντικών Googler που δεν έχουν έρθει και δεν έχουν φύγει,,en,Πριν πάμε στη λύση,,en,ας καταλάβουμε ποιο είναι το πρόβλημα,,en,Το πρόβλημα είναι η κατανομή της εργασίας μεταξύ δύο υπολογιστών,,en,ένας είναι ο διακομιστής,,en,όπου λειτουργούν το WordPress και η PHP,,en.

While programming my Theme Tweaker, I came across this problem. I had a string on my server in my php program (the tweaked stylesheet, in fact), and I wanted to give the user the option of saving it to a file his computer. I would’ve thought this was a common problem, and all common problems can be solved by Googling. But, lo and behold, I just couldn’t find a satisfactory solution. I found my own, and thought I would share it here, for the benefit of all the future Googlers yet to come and go.

Before we go into the solution, let’s understand what the problem is. The problem is in the division of labor between two computers — one is the server, where your WordPress and PHP are running; το άλλο είναι ο υπολογιστής του πελάτη όπου πραγματοποιείται η προβολή,,en,Η συμβολοσειρά για την οποία μιλάμε βρίσκεται στον διακομιστή,,en,Θέλουμε να το αποθηκεύσουμε σε ένα αρχείο στον υπολογιστή του πελάτη,,en,Ο μόνος τρόπος να το κάνετε είναι να εξυπηρετήσετε τη συμβολοσειρά ως απάντηση html,,en,Με την πρώτη ματιά,,en,αυτό δεν μοιάζει με μεγάλο πρόβλημα,,en,Οι διακομιστές στέλνουν τακτικά συμβολοσειρές και δεδομένα σε πελάτες,,en,έτσι βλέπουμε οτιδήποτε στο πρόγραμμα περιήγησης,,en,συμπεριλαμβανομένων όσων διαβάζετε,,en,Αν ήταν οποιοδήποτε πρόγραμμα PHP που θέλει να σώσει τη συμβολοσειρά,,en,δεν θα ήταν πρόβλημα,,en,Θα μπορούσατε απλώς να πετάξετε τη συμβολοσειρά σε ένα αρχείο στο διακομιστή και να εξυπηρετήσετε το αρχείο,,en,Αλλά τι κάνετε αν δεν θέλετε να δώσετε σε ολόκληρο τον κόσμο έναν τρόπο απόρριψης συμβολοσειρών σε αρχεία στον διακομιστή σας,,en,θα μπορούσες να κάνεις κάτι τέτοιο,,en. The string we are talking about is on the server. We want to save it in a file on the client’s computer. The only way to do it is by serving the string as an html reply.

At first glance, this doesn’t look like a major problem. After all, servers regularly send strings and data to clients — that’s how we see anything on the the browser, including what you are reading. If it was just any PHP program that wants to save the string, it wouldn’t be a problem. You could just dump the string into a file on the server and serve the file.

But what do you do if you don’t want to give the whole world a way of dumping strings to files on your server? Well, you could do something like this:

header('Content-Disposition: attachment; filename="style.css"');
header("Content-Transfer-Encoding: ascii");
header('Expires: 0');
header('Pragma: no-cache');
print $stylestr ;

So, απλά βάλτε αυτόν τον κωδικό στο foo.php που υπολογίζει τη συμβολοσειρά $ stylestr και τελειώσατε,,en,Αλλά το πρόβλημά μας είναι ότι εργαζόμαστε στο πλαίσιο προσθηκών του WordPress,,en,και δεν μπορεί να χρησιμοποιήσει την κεφαλίδα,,en,κλήσεις,,en,Όταν προσπαθείτε να το κάνετε αυτό,,en,θα λάβετε το μήνυμα σφάλματος που λέει ότι η κεφαλίδα έχει ήδη γίνει,,en,Για αυτό το πρόβλημα,,en,Βρήκα την έξυπνη λύση σε ένα από τα πρόσθετα που χρησιμοποιώ,,en,Ξεχάσατε ποιο,,en,αλλά υποθέτω ότι είναι μια κοινή τεχνική,,en,Η λύση είναι να ορίσετε ένα κενό iFrame και να ορίσετε την πηγή του σε αυτό που θα γράψει η συνάρτηση PHP,,en,Δεδομένου ότι το iFrame αναμένει μια πλήρη πηγή HTML,,en,σου επιτρέπεται,,en,υποχρεωμένος,,en,για να δώσετε την κεφαλίδα,,en,οδηγίες,,en,Το απόσπασμα κώδικα μοιάζει με,,en,Τώρα το ερώτημα είναι,,en,ποια πρέπει να είναι η πηγή,,en,τι είναι $ styleurl,,en,δεν πρόκειται να είναι στατικό αρχείο στον διακομιστή σας,,en. But our trouble is that we are working in the WordPress plugin framework, and cannot use the header() calls. When you try to do that, you will get the error message saying that header is already done dude. For this problem, I found the ingenious solution in one of the plugins that I use. Forgot which one, but I guess it is a common technique. The solution is to define an empty iFrame and set its source to what the PHP function would write. Since iFrame expects a full HTML source, you are allowed (in fact, obliged) to give the header() directives. The code snippet looks something like:

<iframe id="saveCSS" src="about:blank" style="visibility:hidden;border:none;height:1em;width:1px;"></iframe>
<script type="text/javascript">
var fram = document.getElementById("saveCSS");
<?php echo 'fram.src = "' . $styleurl .'"' ;

Now the question is, what should the source be? In other words, what is $styleurl? Clearly, it is not going to be a static file on your server. Και ο σκοπός αυτής της ανάρτησης είναι να δείξει ότι δεν χρειάζεται να είναι καθόλου αρχείο στον διακομιστή,,en,Είναι μια απάντηση δύο μερών,,en,Πρέπει να θυμάστε ότι εργάζεστε στο πλαίσιο του WordPress,,en,και δεν μπορείτε να δημιουργήσετε αυτόνομα αρχεία php,,en,Το μόνο πράγμα που μπορείτε να κάνετε είναι να προσθέσετε επιχειρήματα στα υπάρχοντα αρχεία php,,en,ή τα πρόσθετα που έχετε δημιουργήσει,,en,Γι 'αυτό πρώτα κάνετε ένα κουμπί υποβολής ως εξής,,en,Σημειώστε ότι το χαρακτηριστικό ονόματος του κουμπιού είναι,,en,saveCSS.,,en,στο τμήμα του κώδικα που χειρίζεται υποβάλλει,,en,κάνεις κάτι σαν,,en,Αυτό είναι το $ styleurl που θα δώσατε ως πηγή του iFrame,,en,προς τα εμπρός,,sv,Λάβετε υπόψη ότι είναι το ίδιο με το URL της σελίδας σύνδεσης,,en,εκτός από το ότι καταφέρατε να προσθέσετε,,en,σώσει,,en,στο τέλος του,,en,Το επόμενο τέχνασμα είναι να συλλάβει αυτό το επιχείρημα και να το χειριστεί,,en,Γι'αυτό,,en. It is a two-part answer. You have to remember that you are working within the WordPress framework, and you cannot make standalone php files. The only thing you can do is to add arguments to the existing php files, or the plugins you have created. So you first make a submit button as follows:

<form method="post" action="<?php echo $_SERVER["REQUEST_URI"]?>">
<div class="submit">
<input type="submit" name="saveCSS" title="Download the tweaked stylesheet to your computer" value="Download Stylesheet" />

Note that the name attribute of the button is “saveCSS.” Now, in the part of the code that handles submits, you do something like:

if (isset($_POST['saveCSS']))
$styleurl = get_option('siteurl') . '/' . "/wp-admin/themes.php?page=theme-tweaker.php&save" ;


This is the $styleurl that you would give as the source of your iFrame, fram. Note that it is the same as your pluging page URL, except that you managed to add “?save” at the end of it. The next trick is to capture that argument and handle it. For that, χρησιμοποιείτε τη λειτουργία API του WordPress,,en,add_action ως,,en,Αυτό προσθέτει μια συνάρτηση saveCSS στο αρχικό μέρος της προσθήκης σας,,en,Τώρα πρέπει να ορίσετε αυτήν τη λειτουργία,,en,Τώρα είμαστε σχεδόν ελεύθεροι στο σπίτι,,en,Το μόνο πράγμα που πρέπει να καταλάβετε είναι ότι εσείς,,en,κάνω,,en,χρειάζομαι τον κύβο,,en,Εάν η λειτουργία σας δεν πεθαίνει,,en,θα εκτοξεύσει τα υπόλοιπα πράγματα που δημιουργούνται από το WordPress στο αρχείο αποθήκευσής σας,,en,προσαρτώντας το στη συμβολοσειρά σας $ stylestr,,en,Μπορεί να φαίνεται περίπλοκο,,en,Υποθέτω ότι είναι λίγο περίπλοκο,,en,αλλά μόλις το εφαρμόσετε και το ξεκινήσετε,,en,μπορείς,,en,και κάνω,,en,Ξέχνα το,,en,Γι 'αυτό το δημοσίευσα εδώ,,en,έτσι ώστε την επόμενη φορά που πρέπει να το κάνω,,en,Μπορώ να το αναζητήσω,,en,php,,en,προσθήκες,,en,σειρά,,en,wordpress,,en,Το δώρο του Humboldt από τον Saul Bellow,,en, add_action as:

if (isset($_GET['save'] ))
add_action('init', array(&$thmTwk, 'saveCSS'));
remove_action('init', array(&$thmTwk, 'saveCSS'));

This adds a function saveCSS to the init part of your plugin. Now you have to define this function:

function saveCSS() {
header('Content-Disposition: attachment; filename="style.css"');
header("Content-Transfer-Encoding: ascii");
header('Expires: 0');
header('Pragma: no-cache');
$stylestr = "Whatever string you want to save";
ob_start() ;
print $stylestr ;
ob_end_flush() ;
die() ;

Now we are almost home free. The only thing to understand is that you do need the die(). If your function doesn’t die, it will spew out the rest of the WordPress generated stuff into your save file, appending it to your string $stylestr.

It may look complicated. Well, I guess it is a bit complicated, but once you implement it and get it running, you can (and do) forget about it. At least, I do. That’s why I posted it here, so that the next time I need to do it, I can look it up.


I have been doing a bit of geeky stuff latelywriting WordPress plugins. Okay, it is because I’m suffering from a terrible writer’s block.

You see, I’m supposed to be working on my next book. I foolishly promised a couple of chapters of The Principles of Quantitative Development to my commissioning editor at John Wiley & Sons within a month; now I find myself writing everything other than those darned chapters! Including plugins. Coming to think of it, writing those chapters wouldn’t be any less geeky, would it?

That made me wonderWe all started off as geeks, didn’t we? No use denying it. Remember how our teachers loved us, and the sexy cheerleaders, well, didn’t? Later in life, due to exigencies of circumstances, we may have tried to lose our techie halo and simulate a managerial posture. But, in our moments of panic, we go back to our geek roots. At least, I do.

You think you don’t? Well, check out these geek jokes. If you find them funny, chances are your roots are not too different from mine.

Heisenberg was driving down the highway when he was pulled over for speeding. The officer says, “Do you know how fast you were going?” Heisenberg says, “No, but I do know where I am!”

Two Hydrogen atoms walk into a bar. One says, “I’ve lost my electron!” The other says, “Are you sure?” The first replies, “Yes, I’m positive…”

Geek Pickup Lines:

  • Tell me of this thing you humans call [dramatic pause] love.
  • If you turn me down now, I will become more drunk than you can possibly imagine.
  • They don’t call me Bones because I’m a doctor.
  • Your name is Leslie? Look, I can spell your name on my calculator!
  • What’s a nice girl like you doing in a wretched hive of scum and villainy like this?
  • You must be Windows 95 because you got me so unstable.
  • My ‘up-timeis better than BSD.
  • I can tell by your emoticons that you’re looking for some company.
  • Is that an iPod mini in your pocket or are you just happy to see me.
  • Want to see my Red Hat?
  • If you won’t let me buy you a drink, at least let me fix your laptop.
  • You had me atHello World.
  • Mind if I run a sniffer to see if your ports are open?
  • You make me want to upgrade my Tivo.
  • By looking at you I can tell you’re 36-25-36, which by the way are all perfect squares.
  • Jedi Mind Trick: “This is the geek you’re looking for.[Waves hand]
  • You can put a Trojan on my Hard Drive anytime.
  • Have you ever Googled yourself?
  • How about we do a little peer-to-peer saliva swapping?
  • With my IQ and your body we could begin a race of genetic superchildren to conquer the earth.
  • What’s a girl like you doing in a place like this when there’s a Farscape marathon on right now on the Sci Fi channel.
  • I’m attracted to you so strongly, scientists will have to develop a fifth fundamental force.

What Makes 100%?

What does it mean to give MORE than 100%? Ever wonder about those people who say they are giving more than 100%? We have all been to those meetings where someone wants you to give over 100%. How about achieving 103%? What makes up 100% in life? Here’s a little mathematical formula that might help you answer these questions:


A B C D E F G H I J K L M N O P Q R S T U V W X Y Z are represented as:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

then H-A-R-D-W-O-R-K = 8+1+18+4+23+15+18+11 = 98%

and K-N-O-W-L-E-D-G-E = 11+14+15+23+12+5+4+7+5 = 96%

but A-T-T-I-T-U-D-E = 1+20+20+9+20+21+4+5 = 100%

and B-U-L-L-S-H-I-T = 2+21+12+12+19+8+9+20 = 103%

but look how far ass kissing will take you.

A-S-S-K-I-S-S-I-N-G = 1+19+19+11+9+19+19+9+14+7 = 118%

So, one can conclude with mathematical certainty that While Hard work and Knowledge will get you close, and Attitude will get you there, it’s the Bullshit and Ass kissing that will put you over the top.