2009-11-22 20:35:39 +00:00
< ? php
2009-11-22 20:50:16 +00:00
class PostFixtures {
2009-11-23 00:57:35 +00:00
var $messages ;
function init () {
add_action ( 'admin_menu' , array ( & $this , 'admin_menu' ));
add_action ( 'admin_notices' , array ( & $this , 'admin_notices' ));
}
function admin_notices () {
if ( ! empty ( $this -> messages )) { ?>
< div class = " fade updated " >
< ? php foreach ( $this -> messages as $message ) { ?>
< p >< ? php echo $message ?> </p>
< ? php } ?>
</ div >
< ? php }
}
function handle_update ( $info ) {
if ( isset ( $info [ 'is_ok' ])) {
$data = $this -> parse_json ( stripslashes ( $info [ 'data' ]));
if ( ! empty ( $data )) {
$data = $this -> process_data ( $data );
$this -> remove ();
$this -> create ( $data );
$this -> messages [] = " New data set loaded into WordPress. " ;
} else {
$this -> messages [] = " Data is not valid JSON. " ;
}
}
}
function admin_menu () {
global $plugin_page ;
add_submenu_page ( 'tools.php' , __ ( 'Post Fixtures' , 'post-fixtures' ), __ ( 'Post Fixtures' , 'post-fixtures' ), 'manage_options' , 'post-fixtures' , array ( & $this , 'render_admin' ));
if ( $plugin_page == 'post-fixtures' ) {
wp_enqueue_script ( 'jquery' );
}
if ( isset ( $_POST [ 'pf' ])) {
if ( isset ( $_POST [ 'pf' ][ '_nonce' ])) {
if ( wp_verify_nonce ( $_POST [ 'pf' ][ '_nonce' ], 'post-fixtures' )) {
$this -> handle_update ( $_POST [ 'pf' ]);
}
}
}
}
function render_admin () { ?>
< div class = " wrap " >
< h2 >< ? php _e ( 'Post Fixtures' , 'post-fixtures' ) ?> </h2>
< p >
< ? php _e ( '<strong>Post Fixtures</strong> is a developer tool for quickly setting up the WordPress database to test certain combinations of posts, categories, and meta data.' , 'post-fixtures' ); ?>
< ? php _e ( '<strong>You should not have this installed on a live site!</strong>' , 'post-fixtures' ); ?>
< ? php _e ( 'This tool <strong>will delete all of your posts, categories, and metadata as necessary!</strong>' , 'post-fixtures' ); ?>
</ p >
< form action = " " method = " post " id = " post-fixtures-form " >
< input type = " hidden " name = " pf[_nonce] " value = " <?php echo wp_create_nonce('post-fixtures') ?> " />
< h3 >< ? php _e ( 'JSON data to load into the database:' , 'post-fixtures' ) ?> </h3>
< textarea name = " pf[data] " rows = " 20 " style = " width: 100% " ></ textarea >
< label style = " margin: 5px 0; display: block " >
< input type = " checkbox " name = " pf[is_ok] " value = " yes " /> < ? php _e ( 'Yes, I want Post Fixtures to <strong>delete all of my data and load this data instead.</strong>' , 'post-fixtures' ) ?> <br />
</ label >
< input type = " submit " value = " Load Provided Data " />
</ form >
< script type = " text/javascript " >
var form = jQuery ( '#post-fixtures-form' ) . get ( 0 );
if ( form ) {
jQuery ( form ) . submit ( function () {
var checkbox = jQuery ( 'input[name*=is_ok]' , form ) . get ( 0 );
var ok = false ;
if ( checkbox ) {
ok = checkbox . checked ;
}
if ( ! ok ) {
alert ( '<?php _e(' You must check the checkbox to approve this operation . ', ' post - fixtures ') ?>' );
return false ;
}
return true ;
});
}
</ script >
</ div >
< ? php }
// data handling
2009-11-22 20:50:16 +00:00
function parse_json ( $input ) {
if (( $data = json_decode ( $input )) !== false ) {
if ( is_array ( $data ) || is_object ( $data )) {
2009-11-22 20:56:00 +00:00
return array_values (( array ) $data );
2009-11-22 20:50:16 +00:00
}
}
return false ;
}
2009-11-22 22:34:57 +00:00
function remove_all_posts () {
2009-11-23 00:57:35 +00:00
if ( is_array ( $posts = get_posts ( array ( 'numberposts' => '-1' , 'post_status' => 'draft,pending,future,inherit,private,publish' )))) {
2009-11-22 22:34:57 +00:00
foreach ( $posts as $post ) { wp_delete_post ( $post -> ID ); }
}
}
2009-11-22 22:58:34 +00:00
function remove_all_categories () {
foreach ( get_all_category_ids () as $id ) {
wp_delete_category ( $id );
}
}
2009-11-22 23:11:59 +00:00
function process_data ( $data ) {
2009-11-23 13:18:59 +00:00
$posts = $categories = $options = array ();
2009-11-23 12:27:36 +00:00
foreach ( $data as $type => $info ) {
switch ( $type ) {
case 'posts' :
$posts = $info ;
foreach ( $posts as $post ) {
$post = ( array ) $post ;
if ( isset ( $post [ 'categories' ])) {
$categories = array_merge ( $categories , $post [ 'categories' ]);
}
}
break ;
2009-11-23 13:18:59 +00:00
case 'options' :
$options = $info ;
break ;
2009-11-22 23:11:59 +00:00
}
}
2009-11-23 00:57:35 +00:00
$categories = array_unique ( $categories );
2009-11-23 13:18:59 +00:00
return compact ( 'posts' , 'categories' , 'options' );
2009-11-22 23:11:59 +00:00
}
2009-11-22 23:32:52 +00:00
function create_categories ( $categories ) {
$category_ids_by_slug = array ();
if ( is_array ( $categories )) {
foreach ( $categories as $category ) {
2009-11-23 12:23:26 +00:00
$nodes = explode ( '/' , $category );
$parent = 0 ;
$joined_nodes = array ();
foreach ( $nodes as $node ) {
$joined_nodes [] = $node ;
$parent = $category_ids_by_slug [ implode ( '/' , $joined_nodes )] = wp_insert_category ( array ( 'cat_name' => $node , 'slug' => $node , 'category_parent' => $parent ));
}
2009-11-22 23:32:52 +00:00
}
}
return $category_ids_by_slug ;
}
2009-11-22 23:57:23 +00:00
function create_posts ( $posts , $categories ) {
$post_ids_created = array ();
if ( is_array ( $posts )) {
foreach ( $posts as $post ) {
2009-11-23 00:57:35 +00:00
$post = ( array ) $post ;
if ( ! isset ( $post [ 'post_status' ])) {
$post [ 'post_status' ] = 'publish' ;
}
2009-11-22 23:57:23 +00:00
$id = wp_insert_post ( $post );
if ( $id != 0 ) {
$post_ids_created [] = $id ;
if ( isset ( $post [ 'categories' ])) {
$all_categories = array ();
foreach ( $post [ 'categories' ] as $slug ) {
if ( isset ( $categories [ $slug ])) {
$all_categories [] = $categories [ $slug ];
}
}
wp_set_post_categories ( $id , $all_categories );
} else {
wp_set_post_categories ( $id , array ( get_option ( 'default_category' )));
}
if ( isset ( $post [ 'metadata' ])) {
foreach ( $post [ 'metadata' ] as $key => $value ) {
update_post_meta ( $id , $key , $value );
}
}
}
}
}
return $post_ids_created ;
}
2009-11-23 00:05:20 +00:00
function create ( $data ) {
2009-11-23 00:57:35 +00:00
$categories_by_slug = $this -> create_categories ( $data [ 'categories' ]);
$this -> create_posts ( $data [ 'posts' ], $categories_by_slug );
2009-11-23 13:20:52 +00:00
$this -> process_blog_options ( $data [ 'options' ], $categories_by_slug );
2009-11-23 00:05:20 +00:00
}
2009-11-23 00:07:13 +00:00
function remove () {
$this -> remove_all_posts ();
$this -> remove_all_categories ();
}
2009-11-23 13:16:55 +00:00
function process_blog_options ( $options , $categories ) {
$this -> _category = $categories ;
foreach ( $options as $option => $value ) {
$value = preg_replace_callback ( '#\$\{([^\}]+)\}#' , array ( & $this , '_process_blog_options_callback' ), $value );
update_option ( $option , $value );
}
unset ( $this -> _category );
}
function _process_blog_options_callback ( $matches ) {
$value = $matches [ 0 ];
$parts = explode ( ':' , $matches [ 1 ]);
if ( count ( $parts ) > 1 ) {
2009-11-23 13:24:00 +00:00
$source = strtolower ( array_shift ( $parts ));
switch ( $source ) {
case 'cat' : $source = 'category' ; break ;
}
2009-11-23 13:16:55 +00:00
if ( count ( $parts ) == 1 ) {
$index = reset ( $parts );
if ( isset ( $this -> { " _ ${ source}" } )) {
if ( isset ( $this -> { " _ ${ source}" } [ $index ])) {
$value = $this -> { " _ ${ source}" } [ $index ];
}
}
}
}
return $value ;
}
2009-11-22 20:50:16 +00:00
}