WordPress plugin to update values of custom fields from CSV input
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.2 KiB

  1. <?php
  2. /*
  3. Plugin Name: Meta Updater
  4. Plugin URI:
  5. Description: Bulk insert and update custom fields
  6. Version: 0.1
  7. Author: Adrian Short
  8. Author URI: https://adrianshort.org/
  9. License: CC0/public domain
  10. */
  11. add_action( 'admin_menu', 'as_metaupdater_menu' );
  12. // Add submenu to Tools menu
  13. function as_metaupdater_menu() {
  14. add_submenu_page(
  15. 'tools.php', // top-level handle
  16. 'Meta Updater', // page title
  17. 'Meta Updater', // submenu title
  18. 'manage_options', // capabilities
  19. 'as_metaupdater', // submenu handle
  20. 'as_metaupdater_page' //function
  21. );
  22. }
  23. function as_metaupdater_page() {
  24. if ( ! current_user_can( 'manage_options' ) ) {
  25. wp_die("You do not have sufficient permissions to access this page.");
  26. }
  27. ?>
  28. <div class="wrap">
  29. <h2>Meta Updater</h2>
  30. <?php
  31. if ( 'POST' == $_SERVER['REQUEST_METHOD'] ) {
  32. foreach( explode( PHP_EOL, stripslashes( $_POST['data'] ) ) as $row ) {
  33. $data[] = str_getcsv( $row, ",", '"' );
  34. }
  35. // Get header row
  36. list( $search_field, $replace_field ) = array_shift( $data );
  37. echo "<h3>Results</h3>";
  38. $success = 0;
  39. $not_found = array();
  40. foreach( $data as $row ) {
  41. list( $key, $value ) = $row;
  42. if ( $key == '' ) continue; // skip blank lines
  43. $args = array(
  44. 'meta_key' => $search_field,
  45. 'post_type' => 'site'
  46. );
  47. // if ( is_string( $key ) ) {
  48. $args['meta_value'] = $key;
  49. // } elseif ( is_numeric( $key ) ) {
  50. // $args['meta_value_num'] = $key;
  51. // }
  52. echo "<p>";
  53. $query = new WP_Query( $args );
  54. if ( $query->have_posts() ) {
  55. while ( $query->have_posts() ) {
  56. $query->the_post();
  57. if ( $_POST['dry_run'] != '1' ) {
  58. if ( update_post_meta( get_the_ID(), $replace_field, trim( $value ) ) === true ) {
  59. echo "<pre>";
  60. print_r( $args );
  61. echo sprintf( "ID: %d<br>%s: %s<br>Title: %s<br>%s: %s", get_the_ID(), $search_field, $key, get_the_title(), $replace_field, $value );
  62. $success++;
  63. }
  64. }
  65. }
  66. } else {
  67. $not_found[]= $key;
  68. echo "No results<br>";
  69. }
  70. }
  71. echo "<h3>Updated $success custom fields OK.</h3><hr>";
  72. echo "<h3>Errors</h3>";
  73. if ( count( $not_found) > 0 ) {
  74. echo "<p>Posts with the custom field <strong>$search_field</strong> with these values could not be found:</p>\n<ul>";
  75. foreach( $not_found as $error ) {
  76. echo "<li>$error</li>\n";
  77. }
  78. echo "</ul>";
  79. } else {
  80. echo "<p>None.</p>";
  81. }
  82. }
  83. ?>
  84. </div>
  85. <form method="POST" action="">
  86. <p>
  87. Paste in CSV data: column 1 holds the key field and column 2 holds the value. The first row must be a header row. Every post with the field set to the value in column 1 will have a field added or updated with the value in column 2.
  88. </p>
  89. <textarea name="data" rows="15" cols="60">
  90. openlylocal_id,area_covered
  91. 2192,"All of London"
  92. 2191,"Greater Manchester"
  93. 99999,dummy
  94. </textarea>
  95. <p><input type="checkbox" name="dry_run" value="1" checked="checked" /> <label for="dry_run">Dry run - leave the database unchanged</label></p>
  96. <p><input class="button-primary" type="submit" value="Update Custom Fields" /></p>
  97. </form>
  98. <?php
  99. }