Add custom javascript and CSS to WordPress admin

A conceptual example of how you could add css or javascript to your ”edit post” page in the WordPress dashboard.
I included an example of how you can ”send parameters” to the javascript file.

ID;
		$my_params = array(
		  'postid' => $current_id,
		);
		wp_localize_script( 'my_js', 'MyParams', $my_params );
	}
}

if ( class_exists( "MyClass" ) ) 
	$my_class = new MyClass();
else
	error_log( "MyClass missing" );

add_action( 'admin_init', array(&$my_class, 'admin_init') );
add_action( 'admin_print_styles-post.php', array(&$my_class, 'enqueue_css') );
add_action( 'admin_print_scripts-post.php', array(&$my_class, 'enqueue_js') );

TextMate snippet for PRG-pattern in WordPress

This is free TextMate snippet day here at jonasnordstrom.se. Enjoy, and please let me know if there are any errors.


From wikipedia:

Post/Redirect/Get (PRG) is a web development design pattern that prevents 
some duplicate form submissions, creating a more intuitive interface for 
user agents (users). PRG implements bookmarks and the refresh button in a 
predictable way that does not create duplicate form submissions. 

image from wikipedia

PRG is the pattern to aim for when creating functionality for the WordPress backend (wp-admin). But it’s a pain to keep track of which hooks to use, how the redirection works and stuff like that.
Here’s a TextMate snippet that hopefully will be of some help.

Note: I will add nonce and update this post, just wanted to save the code somewhere when it was in front of me, you know how it is …

<?php 
function ${1:function_name}_page() {

    if ( isset( $POST['action'] ) && !current_user_can( '${2:edit_page}' ) ) {
        return;
    } ?>

    <form action="edit.php" method="post">
        <input type="hidden" name="page" value="${1/\_/-/}-page" />
        <input type="hidden" name="action" value="${3:action-name}" />
        <input type="submit" value="${4:Button Text}" />
    </form>
    <?php
}
function $1() {
    if ( isset(\$_POST['action']) && \$_POST['action'] == '$3') {
        // Do your magic here
        $0;

        \$location = admin_url() . "edit.php?page=" . $_POST['page'] . "&feedback=${5:Feedback+here}";

        \$status = 302;
        wp_redirect( \$location, \$status );
        exit;
    }
}
function add_$1_page() {
    add_management_page( '${6:Page Title}', '${7:Menu Title}', '${8:manage_options}', 
                  '${9:menu-slug}', '${1:function_name}_page' );
}

add_action( 'admin_init', '$1' );
add_action( 'admin_menu', 'add_$1_page' );

wpdb->delete() i WordPress 3.4

En av nyheterna i WordPress 3.4 är att metoden delete har tillkommit till wpdb-klassen. Tidigare fanns av någon anledning bara insert och update.
Enkelt exempel på hur den kan användas:
Vad jag vet finns det ingen inbyggd funktion för att ta bort alla förekomster av ett custom field, före WordPress 3.4 var man tvungen att göra en query direkt i databasen för att få till den funktionaliteten.

  function delete_post_meta_for_all( $meta_key ) {  
     global $wpdb; 
     return $wpdb->query( 
        $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key = %s ",
           $meta_key ) ); 
  } 

Tyvärr måste man fortfarande göra något liknande, men syntaxen är lite mer ”WordPress”:

function delete_post_meta_for_all( $meta_key ) { 
   global $wpdb; 
   $result = $wpdb->delete( "$wpdb->postmeta" , 
      array( "meta_key" => $meta_key) , array( '%s' ) ); 
}

Syntax:

function delete( $table, $where, $where_format = null )
$table: table name
$where: A named array of WHERE clauses (in column => value pairs). Multiple clauses will be joined with ANDs. Both $where columns and $where values should be ”raw”.
$where_format Optional: An array of formats to be mapped to each of the values in $where. If string, that format will be used for all of the items in $where. A format is one of ’%d’, ’%f’, ’%s’ (integer, float, string). If omitted, all values in $where will be treated as strings unless otherwise specified in wpdb::$field_types.
return int|false The number of rows updated, or false on error.

Mer info här

Plugin: No Soup

Jag gjorde en plugin (No Soup) som kan spärra vissa IP-adresser från att komma åt din WordPress-sajt och istället skicka iväg dem till en annan adress. Den kan också ta hela IP-block och peka om dem.

Det här skulle till exempel kunna användas för att neka tillträde åt svenska myndigheter militär och politiska partier och istället skicka iväg dem till Wikipedias artikel om ACTA

Läs mer om No Soup.
Ladda ner No Soup från WordPress repository

Snabbare WordPress på egen server

Sen jag bytte till Tilaa, där jag sköter webbserver och databas själv, har svarstiderna förbättrats avsevärt.

Pingdom rapporterar:

 

Jag kör Gentoo Linux, nginx, php-fpm, fastcgi-cache, apc och mysql med query cache.

 

Skapa WordPress-användare direkt i mysql

Jaså, du har en WordPress-instans men kan inte logga in?
Det enklaste sättet är att begära nytt lösenord för en känd användare (admin kanske), men det förutsätter att du kontrollerar mailadressen som den användaren är registrerad med.

Men om du har tillgång till filsystemet där WordPress-filerna ligger så finns det ett annat sätt. I wp-config.php står lösenordet till databasen. Logga in till mysql från prompten (eller via phpmyadmin) och kör följande:

insert into wp_users (user_login, user_pass, user_nicename, 
user_email, display_name) 
values ('myuser', MD5('mypassword'), 'mynicename', 
'mailadress@example.com', 'mydisplayname');

Kontrollera nu vilken ID den posten fick

select ID from wp_users where user_login = 'myuser';

Använd detta id i nedanstående SQL-inserts. I mitt exempel är ID = 34.

insert into wp_usermeta (user_id, meta_key, meta_value) 
values (34, 'wp_capabilities', 'a:1:{s:13:"administrator";b:1;}');

insert into wp_usermeta (user_id, meta_key, meta_value) 
values (34, 'wp_user_level', 10);

Nu ska det gå att logga in med admin-användaren myuser (ändra till lämpligt namn …)

Unrecognized exception: [href=edit-comments.php?page=disqus]

I senaste WordPress-betan, 3.2 beta 1, används jQuery 1.5.2. Den versionen tillåter inte längre css-selektorer som inte sätter attributvärden inom citationstecken.
Om man, som jag, kör Disqus som kommentarsystem så uppstår ett problem, eftersom Disqus använder [property=value]-metoden vilket gör att jag får javascriptfel i admin vilket gör att de flesta menyknappar etc. är helt döda. Firebug visar det här felet:


Som tur är är det lätt att ordna, det är bara att gå in i plugin-filen disqus-comment-system/disqus.php och ändra:

mc.find('a.wp-has-submenu').attr('href', 'edit-comments.php?page=disqus').end()
   .find('.wp-submenu  li:has(a[href=edit-comments.php?page=disqus])')
   .prependTo(mc.find('.wp-submenu ul'));

till

mc.find('a.wp-has-submenu').attr('href', 'edit-comments.php?page=disqus').end()
   .find('.wp-submenu  li:has(a[href="edit-comments.php?page=disqus"])')
   .prependTo(mc.find('.wp-submenu ul'));

(det är alltså [href=edit-comments.php?page=disqus] som behöver attributfnuttar: [href=”edit-comments.php?page=disqus”])

Mer info här.

Jag gissar att Disqus lagar den här buggen väldigt snart.

WordPress for iOS 2.6.4

Det här inlägget skrevs med hjälp av WordPress for iOS 2.6.4, dvs senaste versionen av WordPress på iPhone. Det är mest buggfixar och stabilitetsfixar i den nya versionen, berättar Isaac Keyet på officiella bloggen för WP4iOS.

Den enda nya funktionaliteten är att man kan ange bildstorlekar fritt numera.

Övrigt: preview fungerar inte. Autorotate fungerar inte. Inmatning av länkar är ointuitivt och jag kommer nog inte utsätta mig för det här igen.

Uppdatera till WordPress 3.0.4

Dags att uppgradera WordPress till 3.0.4. Ännu en säkerhetsuppdatering. WordPress själva kallar uppdateringen critical.

Problemet låg i biblioteket kses. Kses används för att filtrera html så att xss-försök och annan elak kod tas bort.
WordPress-Otto har skrivit mer om vad kses är och den riktigt håriga wp-hackern kan studera vad som ändrats direkt i changeseten.
Med andra ord, in och uppdatera.