function comment_conf() { global $wpdb, $eco_clean, $eco_message, $options, $eco_html, $auto_check, $options; ?> <?php if ($eco_clean['submitted'] === true) { ?> <div id="message" class="updated fade"> <p>Comment options received.</p> </div> <?php } elseif (true == $auto_check) { ?> <div id="message" class="updated"> <p>You have scheduled <?php echo strtolower($options['message_which']); ?> to be <?php echo $options['status_pp']; ?> automatically.</p> </div> <?php } ?> <?php if (true == DEBUGGING) { ?> <div class="wrap"> <pre><?php print_r($options); ?> </pre> </div> <?php } ?> <?php if (empty($eco_clean['submitted'])) { /* * * * ------------------------------------------------ THE FORM --------------------------------------------------------- * * * */ ?> <?php if (true == $auto_check) { ?> <div class="wrap"> <h2>Automatic Schedule</h2> <p> <?php if ('posts' == $options['units']) { echo "{$options['message_which']} will be {$options['opposite_status']} on the {$options['last']} most recent posts. " . " {$options['message_which']} on older posts will be {$options['status_pp']} each time a new post is published."; } elseif ('comments' == $options['units']) { echo "{$options['message_which']} will be {$options['status']} on posts once {$options['last']} comments and/or pings have been left on it."; } else { if ('1' == $options['last']) { $options['units'] = rtrim($options['units'], 's'); // cut off the last S if there's only 1! } echo "{$options['message_which']} on posts older than" . " {$options['last']} {$options['units']}" . " will be {$options['status_pp']} automatically. The next scheduled check will be at " . date('G:i, j M Y', $options['next_time']) . '.'; } ?> Cancelling this arrangement does not change the status of comments and pings on any posts. </p> <form action="" method="post"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('eco-submitform'); } ?> <input type="hidden" name="for" value="cancel-auto" /> <p class="submit"><input type="submit" name="cancel-arrangement" value="Cancel this arrangement »"></p> </form> </div> <?php } ?> <div class="wrap"> <h2>Simple Settings</h2> <!-- fieldsets are used here so that the admin page retains good layout when Tiger Admin is used --> <script type="text/javascript"><!-- // from http://www.somacon.com/p143.php function setCheckedValue(radioObj, newValue) { if(!radioObj) return; var radioLength = radioObj.length; if(radioLength == undefined) { radioObj.checked = (radioObj.value == newValue.toString()); return; } for(var i = 0; i < radioLength; i++) { radioObj[i].checked = false; if(radioObj[i].value == newValue.toString()) { radioObj[i].checked = true; } } } //--></script> <form action="" method="post"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('eco-submitform'); } ?> <fieldset> <h3>One-Click</h3> <p>This option applies to every single post, and cancels any automatic arrangment you have made. If you want to exclude certain posts, you should use the “Advanced Settings” form below.</p> <p> <strong>All</strong> comments and pings: <input name="for" value="oneclick-all" type="hidden" /> <span class="submit"> <input name="status" value="Open" type="submit" /> <input name="status" value="Closed" type="submit" /> </span> </p> </fieldset> </form> <form action="" method="post"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('eco-submitform'); } ?> <fieldset style="margin-top: 2em;"> <h3>Posts in the last…</h3> <p>This option respects your excluded posts setting, if you have entered it below.</p> <p> <input name="for" value="oneclick-last" type="hidden" /> <input name="posts" value="<?php echo $eco_html['db_excluded_posts']; ?> " type="hidden" /> Open comments and pings for the last <input name="last" value="5" type="text" size="5" maxlength="5" /> <select name="units"> <option value="posts">Posts</option> <option value="days">Days</option> <option value="weeks">Weeks</option> <option value="months">Months</option> <option value="years">Years</option> </select> , then close the rest. </p> <p> <input name="oneclick-auto" type="checkbox" id="oneclick-auto" value="auto" /> <label for="oneclick-auto">Apply this automatically from now on.</label> </p> <p> <span class="submit"> <input name="oneclick" value="Update" type="submit" /> </span> </p> </fieldset> </form> </div> <div class="wrap"> <form action="" method="post" name="advanced"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('eco-submitform'); } ?> <h2>Advanced Settings</h2> <fieldset class="options"> <table width="100%" cellspacing="2" cellpadding="5" class="editform"> <tr valign="top"> <th width="33%" scope="row">Set the status to:</th> <td> <input name="status" value="open" id="on" type="radio" /> <label for="on">Open (on)</label><br /> <input name="status" value="closed" id="off" type="radio" checked="checked" /> <label for="off">Closed (off)</label> </td> </tr> <tr valign="top"> <th width="33%" scope="row">Apply this to:</th> <td> <input name="comments" value="comments" id="comments" type="checkbox" checked="checked" /> <label for="comments">Comments.</label><br /> <input name="pings" value="pings" id="pings" type="checkbox" checked="checked" /> <label for="pings">Pings (and Trackbacks).</label> </td> </tr> <tr valign="top"> <th width="33%" scope="row">Change the default status of new posts?</th> <td> <input name="future" id="future" value="future" type="checkbox" checked="checked" /> <label for="future">Yes</label> </td> </tr> <tr valign="top"> <th width="33%" scope="row">Which posts?</th> <td> <!-- Option 1 --> <p style="margin-top: 0;"> <input name="for" value="for-new" id="for-new" type="radio" /> <label for="for-new">No existing posts, just change default status for new posts.</label> </p> <!-- Option 2 --> <p> <input name="for" value="for-all" id="for-all" type="radio" checked="checked" /> <label for="for-all">All existing posts</label> </p> <!-- Option 3 --> <p> <input name="for" value="for-bora" id="for-bora" type="radio" /> <label for="for-bora">All posts made</label> <span onclick="setCheckedValue(document.forms['advanced'].elements['for'], 'for-bora')"> <select name="beforeafter"> <option value="before" selected="selected">Before</option> <option value="after">After</option> </select> : <input name="day" value="01" type="text" maxlength="2" size="2" id="day" title="Enter the day (2 digits)" /> <select name="month"> <option value="01">January</option> <option value="02">February</option> <option value="03">March</option> <option value="04">April</option> <option value="05">May</option> <option value="06">June</option> <option value="07">July</option> <option value="08">August</option> <option value="09">September</option> <option value="10">October</option> <option value="11">November</option> <option value="12">December</option> </select> <input name="year" value="<?php echo date('Y'); ?> " type="text" maxlength="4" size="4" id="year" title="Enter the year (4 digits)" /> </span> </p> <!-- Option 4 --> <p> <input name="for" value="for-last" id="for-last" type="radio" /> <label for="for-last">All but the last</label> <span onclick="setCheckedValue(document.forms['advanced'].elements['for'], 'for-last')"> <input name="last" value="5" id="last" type="text" maxlength="5" size="5" /> <select name="units"> <option value="posts">Posts</option> <option value="days">Days</option> <option value="weeks">Weeks</option> <option value="months">Months</option> <option value="years">Years</option> </select> </span><br /> <input name="for-last-auto" type="checkbox" id="for-last-auto" value="auto" style="margin: 5px 0 0 20px;" /> <label for="for-last-auto">Apply this automatically from now on.</label> </p> <!-- Option 5 --> <p> <input name="for" value="for-comments" id="for-comments" type="radio" /> <label for="for-comments">Posts with more than</label> <span onclick="setCheckedValue(document.forms['advanced'].elements['for'], 'for-comments')"> <input name="number-comments" value="10" id="number-comments" type="text" maxlength="5" size="5" /> </span> <label for="for-comments">comments and pings</label><br /> <input name="for-comments-auto" type="checkbox" id="for-comments-auto" value="auto" style="margin-left: 20px;" /> <label for="for-comments-auto">Apply this automatically from now on.</label> </p> </td> </tr> <tr valign="top"> <th width="33%" scope="row"> Exclude posts? </th> <td> <input name="posts" type="text" style="font-family:monospace;" value="<?php echo $eco_html['db_excluded_posts']; ?> " size="50" /> <p> If you have a popular post that draws a lot of comments and you want to leave comments open on it, you can enter its ID here. If you have more than one, enter all the IDs separated by a <strong>comma</strong>. For example: <kbd>12,34,129</kbd>. </p> <p> IDs are the numbers that WordPress assigns to each post. They can be found in the first column of the ‘Manage posts’ page. The IDs you enter are saved and will reappear the next time you load this page. If you want to include a post again, just delete its ID. (You may have to update its comments status manually.) </p> </td> </tr> </table> </fieldset> <p class="submit"> <input name="submit" value="Update" type="submit" /> </p> </form> </div> <?php // OTHERWISE IF FORM HAS BEEN SUBMITTED : } elseif ($eco_clean['submitted'] === true) { check_admin_referer('eco-submitform'); /* * * * ------------------------------------------------ FILTER DATA --------------------------------------------------------- * * * */ // Comments, pings, or both? if ($_POST['comments'] == 'comments' && $_POST['pings'] == 'pings') { $eco_clean['which'] = 'both'; $eco_clean['message_which'] = 'Comments and pings'; } elseif ($_POST['comments'] == 'comments' && empty($_POST['pings'])) { $eco_clean['which'] = 'comments'; $eco_clean['message_which'] = 'Comments'; } elseif ($_POST['pings'] == 'pings' && empty($_POST['comments'])) { $eco_clean['which'] = 'pings'; $eco_clean['message_which'] = 'Pings'; } // The one click options are for both comments and pings if ($_POST['for'] == 'oneclick-all' || $_POST['for'] == 'oneclick-last') { $eco_clean['status'] = 'open'; $eco_clean['message_which'] = 'Comments and pings'; } // Include future posts? if ($_POST['future'] == 'future') { $eco_clean['future'] = true; } $eco_clean['for'] = null; // Which posts? switch ($_POST['for']) { case 'oneclick-all': case 'oneclick-last': case 'for-new': case 'for-all': case 'for-bora': case 'for-last': case 'for-comments': case 'cancel-auto': $eco_clean['for'] = $_POST['for']; } // Status = open or closed? switch ($_POST['status']) { case 'open': case 'Open': $eco_clean['status'] = 'open'; $eco_clean['opposite_status'] = 'closed'; break; case 'closed': case 'Closed': $eco_clean['status'] = 'closed'; $eco_clean['opposite_status'] = 'open'; break; } if ('oneclick-last' == $eco_clean['for']) { $eco_clean['status'] = 'closed'; $eco_clean['opposite_status'] = 'open'; } // BEFOREAFTER SETTINGS if ($eco_clean['for'] == 'for-bora') { if ($_POST['beforeafter'] == 'before' || $_POST['beforeafter'] == 'after') { $eco_clean['beforeafter'] = $_POST['beforeafter']; } // Could I use this alone to check for valid date information? if (checkdate($_POST['day'], $_POST['month'], $_POST['year'])) { $eco_clean['date'] = date('Y-m-d', strtotime("{$_POST['year']}-{$_POST['month']}-{$_POST['day']}")); } } elseif ($eco_clean['for'] == 'for-last' || $eco_clean['for'] == 'oneclick-last') { // Has the auto setting been applied? if ($_POST['oneclick-auto'] == 'auto' || $_POST['for-last-auto'] == 'auto') { $eco_clean['auto-last'] = true; } // Numeric, i.e. last X posts/months/etc. if (is_numeric($_POST['last'])) { $eco_clean['last'] = $_POST['last']; } else { $eco_clean['last'] = 'error'; } switch ($_POST['units']) { case 'posts': case 'days': case 'weeks': case 'months': case 'years': $eco_clean['units'] = $_POST['units']; break; } } elseif ($eco_clean['for'] == 'for-comments') { if ($_POST['for-comments-auto'] == 'auto') { $eco_clean['auto-comments'] = true; } if (ctype_digit($_POST['number-comments'])) { $eco_clean['number-comments'] = $_POST['number-comments']; } else { $eco_clean['number-comments'] = 'error'; } } // IF POSTS FOR EXCLUSION HAVE BEEN ENTERED ... if (preg_match('/^[0-9, ]*$/', $_POST['posts'])) { $treatments = preg_replace('/ {2,}/', ' ', $_POST['posts']); // remove excessive spaces $treatments = trim($treatments, ' ,'); // get rid of commas and whitespace at the beginning and end if (strpos($treatments, ' ') && !strpos($treatments, ',')) { $treatments = str_replace(' ', ', ', $treatments); } $eco_clean['posts'] = $treatments; } elseif ($_POST['posts'] == '') { $eco_clean['posts'] = ''; } else { $eco_clean['posts'] = 'error'; } foreach ($eco_clean as $key => $value) { $eco_html[$key] = wp_specialchars($value); } $eco_html['status_pp'] = $eco_clean['status'] == 'open' ? 'opened' : 'closed'; $eco_html['opp_pp'] = $eco_clean['opposite_status'] == 'open' ? 'opened' : 'closed'; /* * * * ------------------------------------------------ ERRORS AND DEBUGGING --------------------------------------------------------- * * * */ if (DEBUGGING === TRUE) { function eco_debugging() { ?> <h3>Debugging Information</h3> <pre style="border: 1px solid black; background: #fafafa; padding: 5px;"><?php global $eco_clean, $eco_message, $eco_html, $options; $eco_POST_html = array(); foreach ($_POST as $key => $value) { $eco_POST_html[$key] = wp_specialchars($value); } echo '<strong>$_POST</strong>:' . "\n"; print_r($eco_POST_html); echo "\n"; foreach ($eco_clean as $key => $value) { $eco_clean_html[$key] = wp_specialchars($value); } echo '<strong>$eco_clean</strong>:' . "\n"; print_r($eco_clean_html); echo "\n"; echo '<strong>$eco_html</strong>' . "\n"; print_r($eco_html); echo "\n"; echo "These are the arguments supplied to eco_query():\n"; echo '<strong>ECO_QUERYVARS</strong>: ' . ECO_QUERYVARS . "\n"; if (defined('ECO_QUERYVARS2')) { echo '<strong>ECO_QUERYVARS2</strong>: ' . ECO_QUERYVARS2 . "\n"; } echo "\nSQL query(-ies) sent to the database\n"; echo '<strong>ECO_SQL</strong>: ' . ECO_SQL . "\n"; if (defined('ECO_SQL2')) { echo '<strong>ECO_SQL2</strong>: ' . ECO_SQL2 . "\n"; } echo "\n" . '<strong>$eco_message</strong>:' . "\n" . wp_specialchars($eco_message) . "\n\n"; if (!empty($options)) { foreach ($options as $key => $value) { $options[$key] = wp_specialchars($value); } echo "\n" . '<strong>$options</strong>:' . "\n"; print_r($options); } ?> </pre><?php } } // If 'LAST X' and the 'last' value is wrong if (($eco_clean['for'] == 'oneclick-last' || $eco_clean['for'] == 'for-last') && $eco_clean['last'] == 'error') { eco_error('Please provide a number in the “last” box.'); } // If it's 'BEFORE/AFTER' and the date is wrong if ($eco_clean['for'] == 'for-bora' && $eco_clean['date'] == 'error') { eco_error('The date you provided wasn’t a valid calendar date, please check it for errors.'); } // If 'EXCLUDED POSTS' have been entered and aren't nice if ($eco_clean['posts'] == 'error') { eco_error('Please make sure you enter the IDs of posts as numbers separated by a comma and space. For example: <kbd>12, 34, 129</kbd>'); } // If it's X comments then close, and it's not a number. if ($eco_clean['for'] == 'for-comments' && $eco_clean['number-comments'] == 'error') { eco_error('Please enter the number of comments as a number.'); } /* * * * ----------------------------------------- UPDATE OPTIONS and SEND QUERY --------------------------------------------------------- * * * */ // -------------------------------- WORKHORSE: Where the changes are actually made -------------------------------- // If excluded posts have changed since they were last entered AND if the one-click options haven't been used if ($eco_clean['posts'] != get_option('eco_excluded_posts') && !in_array($eco_clean['for'], array('oneclick-all', 'oneclick-last'))) { update_option('eco_excluded_posts', $eco_clean['posts']); } $eco_auto_cancel = false; switch ($eco_clean['for']) { // IF CANCEL ARRANGEMENT SELECTED case 'cancel-auto': eco_cancel_auto(); $eco_message = 'Your automatic arrangment has been cancelled. No other settings have been changed.'; break; // IF ALL POSTS ONE CLICK SELECTED // IF ALL POSTS ONE CLICK SELECTED case 'oneclick-all': update_option('default_comment_status', $eco_clean['status']); update_option('default_ping_status', $eco_clean['status']); if (true == $auto_check) { $eco_auto_cancel = true; eco_cancel_auto(); } eco_query('both', $eco_clean['status']); $eco_message = '<strong>Comments and pings</strong> for ' . '<strong>all existing posts</strong> have been set to ' . "<strong>{$eco_html['status']}</strong>. The default status for comments and pings on new posts is also " . "<strong>{$eco_html['status']}</strong>."; break; // IF 'NO EXISTING POSTS' SELECTED // IF 'NO EXISTING POSTS' SELECTED case 'for-new': default_comments_status(); $eco_message = 'The default setting for <strong>' . strtolower($eco_html['message_which']) . '</strong> on new posts have been set to ' . " <strong>{$eco_html['status']}</strong>. No existing posts have been changed."; break; // IF 'ALL EXISTING POSTS' SELECTED // IF 'ALL EXISTING POSTS' SELECTED case 'for-all': default_comments_status(); eco_query($eco_clean['which'], $eco_clean['status'], null, null, $eco_clean['posts']); $eco_message = "<strong>{$eco_html['message_which']}</strong> for <strong>all existing posts</strong> have been set to " . " <strong>{$eco_html['status']}</strong>."; break; // IF 'BEFORE / AFTER' SELECTED // IF 'BEFORE / AFTER' SELECTED case 'for-bora': default_comments_status(); eco_query($eco_clean['which'], $eco_clean['status'], $eco_clean['beforeafter'], $eco_clean['date'], $eco_clean['posts']); $eco_message = "<strong>{$eco_html['message_which']}</strong> for posts made " . "<strong>{$eco_html['beforeafter']} " . date('jS F, Y', strtotime($eco_clean['date'])) . "</strong>" . " are now <strong>{$eco_html['status']}</strong>."; break; // IF LAST 'X' ONE CLICK or 'LAST X' SELECTED // IF LAST 'X' ONE CLICK or 'LAST X' SELECTED case 'oneclick-last': case 'for-last': if ($eco_clean['for'] == 'oneclick-last') { update_option('default_comment_status', 'open'); update_option('default_ping_status', 'open'); $eco_clean['posts'] = get_option('eco_excluded_posts'); $eco_clean['which'] = 'both'; } else { default_comments_status(); } // Last X posts if ($eco_clean['units'] == 'posts') { $count = $wpdb->get_var("SELECT COUNT(ID) FROM {$wpdb->posts} WHERE `post_status` = 'publish' AND `post_type` = 'post'"); if ($eco_clean['last'] > $count) { if ($count == '1') { eco_error("You can't change the last {$eco_html['last']} posts because there’ only 1 post!"); } else { eco_error("You can't change the last {$eco_html['last']} posts because there are only {$count} posts!"); } } else { // do the opposite to all posts, then do intended to the right ones eco_query($eco_clean['which'], $eco_clean['status'], null, null, $eco_clean['posts']); eco_query($eco_clean['which'], $eco_clean['opposite_status'], 'last', $eco_clean['last'], $eco_clean['posts']); } // Last X days/weeks/months/years } else { $eco_clean['date'] = date_from_last($eco_clean['last'], $eco_clean['units']); eco_query($eco_clean['which'], $eco_clean['status'], 'after', $eco_clean['date'], $eco_clean['posts']); eco_query($eco_clean['which'], $eco_clean['opposite_status'], 'before', $eco_clean['date'], $eco_clean['posts']); } if ('posts' == $eco_clean['units']) { $eco_message = '<strong>Comments and pings</strong> for the ' . "<strong>last {$eco_html['last']} {$eco_html['units']}</strong> " . "are now <strong>{$eco_html['opposite_status']}</strong>. The rest have been <strong>{$eco_html['status_pp']}</strong>."; } else { if ('1' == $eco_clean['last']) { $eco_html['units'] = rtrim($eco_html['units'], 's'); // cut off the last S if there's only 1! } $eco_message = "<strong>Comments and pings</strong> for posts made " . "<strong>before " . date('jS F, Y', strtotime($eco_clean['date'])) . " ({$eco_html['last']} {$eco_html['units']} ago)</strong>" . " are now <strong>{$eco_html['status']}</strong>."; } /* Updating automatic settings If there is already a arrangement in place, update options If there is no arrangement, update options and schedule the arrangement if the units aren't posts */ // If the option for automatic hasn't been selected, or if there isn't already one in place, these won't be executed. if (true == $eco_clean['auto-last'] || true == $auto_check) { update_option('eco_auto_which', $eco_clean['which']); update_option('eco_auto_status', $eco_clean['status']); update_option('eco_auto_last', $eco_clean['last']); update_option('eco_auto_units', $eco_clean['units']); // Only schedule the auto thing if it's a unit of time if ('posts' == $eco_clean['units']) { $eco_message = "<strong>{$eco_html['message_which']}</strong> will be <strong>{$eco_html['opposite_status']}</strong> on the " . " <strong>{$eco_html['last']}</strong> most recent posts." . " {$eco_html['message_which']} on older posts will be <strong>{$eco_html['status_pp']}</strong> each time a new post is published."; } else { // If there isn't already a schedule in place, put one in place // Can't use $auto_check because it's true at this point if (false == ctype_digit(wp_next_scheduled('eco_auto'))) { wp_clear_scheduled_hook('eco_auto'); wp_schedule_event(time() + 60, 'daily', 'eco_auto'); // first time to run is 1 minute from now } $eco_message = "<strong>{$eco_html['message_which']}</strong> on posts older than <strong>{$eco_html['last']} {$eco_html['units']}</strong> will be " . " <strong>{$eco_html['status_pp']}</strong> automatically."; } } break; // IF 'MORE THAN X COMMENTS' SELECTED // IF 'MORE THAN X COMMENTS' SELECTED case 'for-comments': default_comments_status(); eco_query($eco_clean['which'], $eco_clean['status'], 'comments', $eco_clean['number-comments'], $eco_clean['posts']); $eco_message = "<strong>{$eco_html['message_which']}</strong> for posts with more than " . "<strong>{$eco_html['number-comments']} comments and/or pings</strong> are now <strong>{$eco_html['status']}</strong>."; if ($eco_clean['auto-comments'] == true) { update_option('eco_auto_which', $eco_clean['which']); update_option('eco_auto_status', $eco_clean['status']); update_option('eco_auto_last', $eco_clean['number-comments']); update_option('eco_auto_units', 'comments'); $eco_message = "<strong>{$eco_html['message_which']}</strong> will be <strong>{$eco_html['status_pp']}</strong> " . " on posts once <strong>{$eco_html['number-comments']}</strong> comments and/or pings have been left on it."; } break; } //end switch // -------------------------------- SHOW THE RESULTS OF THE QUERY TO THE USER -------------------------------- ?> <div class="wrap"> <h2>Results</h2> <ul> <?php echo "\t<li>{$eco_message}</li>\n"; if ($eco_auto_cancel == true) { echo "\t<li>Your automatic arrangement has been cancelled.</li>\n"; } if ($eco_clean['future'] === true && $eco_clean['for'] != 'for-new') { echo "\t<li>The default setting for <strong>" . strtolower($eco_clean['message_which']); if ('for-last' == $eco_clean['for'] || 'oneclick-last' == $eco_clean['for'] || 'for-comments' == $eco_clean['for']) { echo "</strong> has also been set to <strong>{$eco_html['opposite_status']}</strong>.</li>\n"; } else { echo "</strong> has also been set to <strong>{$eco_html['status']}</strong>.</li>\n"; } } if (!empty($eco_clean['posts']) && $eco_clean['for'] != 'for-new') { echo "\t<li>The following posts were not changed: <ul style='margin-top:5px;'>\n"; $eco_unchanged = explode(',', $eco_html['posts']); foreach ($eco_unchanged as $unch_id) { $unch_id = trim($unch_id); echo '<li><a href="' . get_permalink($unch_id) . '">' . get_the_title($unch_id) . '</a>' . " [<a href='post.php?action=edit&post={$unch_id}'>Edit</a>]</li>\n"; } echo '</ul>'; } ?> </ul> <?php if (DEBUGGING === TRUE) { eco_debugging($eco_html); } } // end if form submitted ?> </div> <?php }
function comment_conf() { global $wpdb, $eco_clean, $eco_message, $options, $eco_html, $auto_check, $options; ?> <div class="wrap"> <div id="icon-edit-comments" class="icon32"><br /></div> <h2>Extended Comment Options</h2> <?php if ($eco_clean['submitted'] === true) { ?> <div id="message" class="updated fade"> <p>Comment options received.</p> </div> <?php } ?> <?php if (true == DEBUGGING) { ?> <div class="wrap"> <?php pre($options, '$options'); ?> </div> <?php } ?> <?php if (empty($eco_clean['submitted'])) { // Before form submitted /* * * * ------------------------------------------------ THE FORM --------------------------------------------------------- * * * */ ?> <?php if (true == $auto_check) { ?> <h3><?php echo $options['message_which']; ?> are being managed automatically</h3> <?php switch ($options['for']) { case 'for-all': echo "<p>{$options['message_which']} are {$options['status']} on this blog.</p>"; break; case 'for-bora': $date = date('l jS F, Y', strtotime($options['year'] . '-' . $options['month'] . '-' . $options['day'])); echo "<p>{$options['message_which']} on posts made before {$date} are {$options['status']} on this blog.</p>"; break; case 'for-last': if ('posts' == $options['units']) { echo "<p>{$options['message_which']} are {$options['status']} on all but the last {$options['last']} posts.</p>"; } else { $display_units = 1 == $options['last'] ? rtrim($options['units'], 's') : $options['units']; echo "<p>{$options['message_which']} are {$options['status']} on posts older than {$options['last']} {$display_units}.</p>"; } break; case 'for-comments': echo "<p>{$options['message_which']} are {$options['status']} on posts with more than {$options['number-comments']} comments.</p>"; break; } if (!empty($options['db_excluded_posts'])) { echo "\t<p>The following posts won’t be changed</p> <ul>\n"; $eco_unchanged = explode(',', $options['db_excluded_posts']); foreach ($eco_unchanged as $unch_id) { $unch_id = trim($unch_id); echo '<li><a href="' . get_permalink($unch_id) . '">' . get_the_title($unch_id) . '</a>' . " [<a href='post.php?action=edit&post={$unch_id}'>Edit</a>]</li>\n"; } echo '</ul>'; } ?> <form action="" method="post"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('eco-submitform'); } ?> <input type="hidden" name="for" value="cancel-auto" /> <p><input type="submit" name="cancel-arrangement" value="Switch to manual control »" class="button"></p> </form> <?php } else { ?> <script type="text/javascript"><!-- // from http://www.somacon.com/p143.php function setCheckedValue(radioObj, newValue) { if(!radioObj) return; var radioLength = radioObj.length; if(radioLength == undefined) { radioObj.checked = (radioObj.value == newValue.toString()); return; } for(var i = 0; i < radioLength; i++) { radioObj[i].checked = false; if(radioObj[i].value == newValue.toString()) { radioObj[i].checked = true; } } } //--></script> <form action="" method="post" name="advanced"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('eco-submitform'); } ?> <table class="form-table"> <p> I want to <select name="status"> <?php eco_option('closed', 'close', 'status'); ?> <?php eco_option('open', 'open', 'status'); ?> </select> <select name="discussion"> <?php eco_option('both', 'comments and pings', 'discussion'); ?> <?php eco_option('comments', 'comments', 'discussion'); ?> <?php eco_option('pings', 'pings', 'discussion'); ?> </select> on </p> <tr valign="top"> <th width="20%" scope="row">Which Posts</th> <td> <!-- Option 2 --> <p> <?php eco_input('for', 'radio', 'for-all', true); ?> <label for="for-for-all">All posts</label> </p> <!-- Option 3 --> <p> <?php eco_input('for', 'radio', 'for-bora'); ?> <label for="for-for-bora">All posts made</label> <span onfocus="setCheckedValue(document.forms['advanced'].elements['for'], 'for-bora')"> <select name="beforeafter"> <?php eco_option('before', 'Before', 'beforeafter'); ?> <?php eco_option('after', 'After', 'beforeafter'); ?> </select> : <?php eco_text_input('day', date('d'), '2', '2', 'Enter the day (2 digits)'); ?> <select name="month"> <?php eco_option('01', 'January', 'month'); eco_option('02', 'February', 'month'); eco_option('03', 'March', 'month'); eco_option('04', 'April', 'month'); eco_option('05', 'May', 'month'); eco_option('06', 'June', 'month'); eco_option('07', 'July', 'month'); eco_option('08', 'August', 'month'); eco_option('09', 'September', 'month'); eco_option('10', 'October', 'month'); eco_option('11', 'November', 'month'); eco_option('12', 'December', 'month'); ?> </select> <?php eco_text_input('year', date('Y'), '4', '4', 'Enter the year (4 digits)'); ?> </span> </p> <!-- Option 4 --> <p> <?php eco_input('for', 'radio', 'for-last'); ?> <label for="for-for-last">All but the last</label> <span onfocus="setCheckedValue(document.forms['advanced'].elements['for'], 'for-last')"> <?php eco_text_input('last', '5', '5', '5'); ?> <select name="units"> <?php eco_option('posts', 'Posts', 'units'); eco_option('days', 'Days', 'units'); eco_option('weeks', 'Weeks', 'units'); eco_option('months', 'Months', 'units'); eco_option('years', 'Years', 'units'); ?> </select> </span> </p> <!-- Option 5 --> <p> <?php eco_input('for', 'radio', 'for-comments'); ?> <label for="for-for-comments">Posts with more than</label> <span onclick="setCheckedValue(document.forms['advanced'].elements['for'], 'for-comments')"> <?php eco_text_input('number-comments', '10', '5', '5'); ?> </span> <label for="for-for-comments">comments and pings</label> </p> </td> </tr> <tr valign="top"> <th scope="row">Auto</th> <td> <?php eco_input('auto', 'checkbox', 'auto', true); ?> <label for="auto">Apply this automatically from now on.</label> </td> </tr> <tr valign="top"> <th scope="row"> Exclude Posts </th> <td> <p> If you want to manage comments and pings on certain posts yourself, check the appropriate post in the box below. The posts you select won’t be touched. </p> <div style="height: 15em; overflow: auto; border: 1px solid black; padding: 5px;"> <?php $excluded_posts = explode(',', get_option('eco_excluded_posts')); $posts = $wpdb->get_results("SELECT ID, post_title, post_date FROM {$wpdb->posts} WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date", ARRAY_A); foreach ($posts as $post) { $checked = in_array($post['ID'], $excluded_posts) ? 'checked="checked"' : ''; $post['post_date'] = date('d-M-Y', strtotime($post['post_date'])); $post['post_title'] = wp_specialchars($post['post_title']); echo "<input type='checkbox' name='exclude-post-{$post['ID']}' value='{$post['ID']}' id='post-{$post['ID']}'{$checked}> <label for='post-{$post['ID']}'>{$post['post_date']}: {$post['post_title']}</label><br />"; } ?> </div> </td> </tr> </table> <p class="submit"> <input name="submit" value="Update" type="submit" /> </p> </form> <?php } // end if auto_check // OTHERWISE IF FORM HAS BEEN SUBMITTED : } elseif ($eco_clean['submitted'] === true) { check_admin_referer('eco-submitform'); /* * * * ------------------------------------------------ FILTER DATA --------------------------------------------------------- * * * */ // Comments, pings, or both? switch ($_POST['discussion']) { case 'both': $eco_clean['which'] = 'both'; $eco_clean['message_which'] = 'Comments and pings'; break; case 'comments': $eco_clean['which'] = 'comments'; $eco_clean['message_which'] = 'Comments'; break; case 'pings': $eco_clean['which'] = 'pings'; $eco_clean['message_which'] = 'Pings'; break; } $eco_clean['for'] = null; // Which posts? switch ($_POST['for']) { case 'for-new': case 'for-all': case 'for-bora': case 'for-last': case 'for-comments': case 'cancel-auto': $eco_clean['for'] = $_POST['for']; } // Status = open or closed? switch ($_POST['status']) { case 'open': $eco_clean['status'] = 'open'; $eco_clean['opposite_status'] = 'closed'; break; case 'closed': $eco_clean['status'] = 'closed'; $eco_clean['opposite_status'] = 'open'; break; } // BEFOREAFTER SETTINGS if ($eco_clean['for'] == 'for-bora') { if ($_POST['beforeafter'] == 'before' || $_POST['beforeafter'] == 'after') { $eco_clean['beforeafter'] = $_POST['beforeafter']; } // Could I use this alone to check for valid date information? if (checkdate($_POST['month'], $_POST['day'], $_POST['year'])) { $eco_clean['date'] = date('Y-m-d', strtotime("{$_POST['year']}-{$_POST['month']}-{$_POST['day']}")); } else { $eco_clean['date'] = 'error'; } } elseif ($eco_clean['for'] == 'for-last') { // Numeric, i.e. last X posts/months/etc. if (is_numeric($_POST['last'])) { $eco_clean['last'] = $_POST['last']; } else { $eco_clean['last'] = 'error'; } switch ($_POST['units']) { case 'posts': case 'days': case 'weeks': case 'months': case 'years': $eco_clean['units'] = $_POST['units']; break; } } elseif ($eco_clean['for'] == 'for-comments') { if (ctype_digit($_POST['number-comments'])) { $eco_clean['number-comments'] = $_POST['number-comments']; } else { $eco_clean['number-comments'] = 'error'; } } // Has the auto setting been applied? if ($_POST['auto'] == 'auto') { $eco_clean['auto'] = true; } // IF POSTS FOR EXCLUSION HAVE BEEN ENTERED ... $excluded_posts = array(); foreach ($_POST as $key => $value) { if (strpos($key, 'exclude-post-') !== false) { if (preg_match('/^[0-9]*$/', $value)) { $excluded_posts[] = $value; } } } if (empty($excluded_posts)) { $eco_clean['posts'] = ''; } else { $eco_clean['posts'] = implode(',', $excluded_posts); } foreach ($eco_clean as $key => $value) { $eco_html[$key] = wp_specialchars($value); } $eco_html['status_pp'] = $eco_clean['status'] == 'open' ? 'opened' : 'closed'; $eco_html['opp_pp'] = $eco_clean['opposite_status'] == 'open' ? 'opened' : 'closed'; /* * * * ------------------------------------------------ ERRORS AND DEBUGGING --------------------------------------------------------- * * * */ if (DEBUGGING === TRUE) { function eco_debugging() { ?> <h3>Debugging Information</h3> <pre style="border: 1px solid black; background: #fafafa; padding: 5px;"><?php global $eco_clean, $eco_message, $eco_html, $options; $eco_POST_html = array(); foreach ($_POST as $key => $value) { $eco_POST_html[$key] = wp_specialchars($value); } echo '<strong>$_POST</strong>:' . "\n"; print_r($eco_POST_html); echo "\n"; foreach ($eco_clean as $key => $value) { $eco_clean_html[$key] = wp_specialchars($value); } echo '<strong>$eco_clean</strong>:' . "\n"; print_r($eco_clean_html); echo "\n"; echo '<strong>$eco_html</strong>' . "\n"; print_r($eco_html); echo "\n"; echo "These are the arguments supplied to eco_query():\n"; echo '<strong>ECO_QUERYVARS</strong>: ' . ECO_QUERYVARS . "\n"; if (defined('ECO_QUERYVARS2')) { echo '<strong>ECO_QUERYVARS2</strong>: ' . ECO_QUERYVARS2 . "\n"; } echo "\nSQL query(-ies) sent to the database\n"; echo '<strong>ECO_SQL</strong>: ' . ECO_SQL . "\n"; if (defined('ECO_SQL2')) { echo '<strong>ECO_SQL2</strong>: ' . ECO_SQL2 . "\n"; } echo "\n" . '<strong>$eco_message</strong>:' . "\n" . wp_specialchars($eco_message) . "\n\n"; if (!empty($options)) { foreach ($options as $key => $value) { $options[$key] = wp_specialchars($value); } echo "\n" . '<strong>$options</strong>:' . "\n"; print_r($options); } ?> </pre><?php } } // If 'LAST X' and the 'last' value is wrong if ($eco_clean['for'] == 'for-last' && $eco_clean['last'] == 'error') { eco_error('Please provide a number in the “last” box.'); } // If it's 'BEFORE/AFTER' and the date is wrong if ($eco_clean['for'] == 'for-bora' && $eco_clean['date'] == 'error') { eco_error('The date you provided wasn’t a valid calendar date, please check it for errors.'); } // If 'EXCLUDED POSTS' have been entered and aren't nice if ($eco_clean['posts'] == 'error') { eco_error('Please make sure you enter the IDs of posts as numbers separated by a comma and space. For example: <kbd>12, 34, 129</kbd>'); } // If it's X comments then close, and it's not a number. if ($eco_clean['for'] == 'for-comments' && $eco_clean['number-comments'] == 'error') { eco_error('Please enter the number of comments as a number.'); } /* * * * ----------------------------------------- UPDATE OPTIONS and SEND QUERY --------------------------------------------------------- * * * */ // -------------------------------- WORKHORSE: Where the changes are actually made -------------------------------- if ('cancel-auto' != $eco_clean['for']) { // If excluded posts have changed since they were last entered AND if the one-click options haven't been used if ($eco_clean['posts'] != get_option('eco_excluded_posts')) { update_option('eco_excluded_posts', $eco_clean['posts']); } update_option('eco_for', $eco_clean['for']); } update_option('eco_status', $eco_clean['status']); update_option('eco_discussion', $eco_clean['which']); $eco_auto_cancel = false; switch ($eco_clean['for']) { // IF CANCEL ARRANGEMENT SELECTED case 'cancel-auto': eco_cancel_auto(); $eco_message = 'Your automatic arrangment has been cancelled. No comments or pings have been opened or closed.'; break; // IF 'ALL EXISTING POSTS' SELECTED // IF 'ALL EXISTING POSTS' SELECTED case 'for-all': if (true == $eco_clean['auto']) { default_comments_status($eco_clean['which'], $eco_clean['status']); } eco_query($eco_clean['which'], $eco_clean['status'], null, null, $eco_clean['posts']); $eco_message = "<strong>{$eco_html['message_which']}</strong> for <strong>all existing posts</strong> have been set to " . " <strong>{$eco_html['status']}</strong>."; break; // IF 'BEFORE / AFTER' SELECTED // IF 'BEFORE / AFTER' SELECTED case 'for-bora': if ('before' == $eco_clean['beforeafter']) { // We apply the status to the posts made before the date eco_query($eco_clean['which'], $eco_clean['status'], 'before', $eco_clean['date'], $eco_clean['posts']); // Then we apply the opposite to the posts made after the date, and change the default to opposite. eco_query($eco_clean['which'], $eco_clean['opposite_status'], 'after', $eco_clean['date'], $eco_clean['posts']); if (true == $eco_clean['auto']) { default_comments_status($eco_clean['which'], $eco_clean['opposite_status']); } } elseif ('after' == $eco_clean['beforeafter']) { // We apply the opposite status to the posts made before the date eco_query($eco_clean['which'], $eco_clean['opposite_status'], 'before', $eco_clean['date'], $eco_clean['posts']); // Then we apply the status to the posts made after the date, and change the default to status eco_query($eco_clean['which'], $eco_clean['status'], 'after', $eco_clean['date'], $eco_clean['posts']); if (true == $eco_clean['auto']) { default_comments_status($eco_clean['which'], $eco_clean['status']); } } $day = date('d', strtotime($eco_clean['date'])); $month = date('m', strtotime($eco_clean['date'])); $year = date('Y', strtotime($eco_clean['date'])); update_option('eco_day', $day); update_option('eco_month', $month); update_option('eco_year', $year); update_option('eco_beforeafter', $eco_clean['beforeafter']); $eco_message = "<strong>{$eco_html['message_which']}</strong> for posts made " . "<strong>{$eco_html['beforeafter']} " . date('jS F, Y', strtotime($eco_clean['date'])) . "</strong>" . " are now <strong>{$eco_html['status']}</strong>."; break; // IF 'LAST X' SELECTED // IF 'LAST X' SELECTED case 'for-last': if (true == $eco_clean['auto']) { default_comments_status($eco_clean['which'], $eco_clean['opposite_status']); } update_option('eco_status', $eco_clean['status']); // Last X posts if ($eco_clean['units'] == 'posts') { $count = $wpdb->get_var("SELECT COUNT(ID) FROM {$wpdb->posts} WHERE `post_status` = 'publish' AND `post_type` = 'post'"); if ($eco_clean['last'] > $count) { if ($count == '1') { eco_error("You can't change the last {$eco_html['last']} posts because there is only 1 post!"); } else { eco_error("You can't change the last {$eco_html['last']} posts because there are only {$count} posts!"); } } else { // do the selected to all posts, then apply the opposite to the right ones // This is because of the wording of the admin panel (STATUS all but the last ... means do STATUS to all, then OPPOSITE to the last ...) eco_query($eco_clean['which'], $eco_clean['status'], null, null, $eco_clean['posts']); eco_query($eco_clean['which'], $eco_clean['opposite_status'], 'last', $eco_clean['last'], $eco_clean['posts']); update_option('eco_units', 'posts'); update_option('eco_last', $eco_clean['last']); } // Last X days/weeks/months/years } else { $eco_clean['date'] = date_from_last($eco_clean['last'], $eco_clean['units']); eco_query($eco_clean['which'], $eco_clean['status'], 'before', $eco_clean['date'], $eco_clean['posts']); eco_query($eco_clean['which'], $eco_clean['opposite_status'], 'after', $eco_clean['date'], $eco_clean['posts']); update_option('eco_units', $eco_clean['units']); update_option('eco_last', $eco_clean['last']); } if ('posts' == $eco_clean['units']) { $eco_message = '<strong>Comments and pings</strong> for the ' . "<strong>last {$eco_html['last']} {$eco_html['units']}</strong> " . "are now <strong>{$eco_html['opposite_status']}</strong>. The rest have been <strong>{$eco_html['status_pp']}</strong>."; } else { if ('1' == $eco_clean['last']) { $eco_html['units'] = rtrim($eco_html['units'], 's'); // cut off the last S if there's only 1! } $eco_message = "<strong>Comments and pings</strong> for posts made " . "<strong>before " . date('jS F, Y', strtotime($eco_clean['date'])) . " ({$eco_html['last']} {$eco_html['units']} ago)</strong>" . " are now <strong>{$eco_html['status']}</strong>."; } /* Updating automatic settings If there is already a arrangement in place, update options If there is no arrangement, update options and schedule the arrangement if the units aren't posts */ // If the option for automatic hasn't been selected, or if there isn't already one in place, these won't be executed. if (true == $eco_clean['auto'] || true == $auto_check) { } break; // IF 'MORE THAN X COMMENTS' SELECTED // IF 'MORE THAN X COMMENTS' SELECTED case 'for-comments': if (true == $eco_clean['auto']) { default_comments_status($eco_clean['which'], $eco_clean['opposite_status']); } update_option('eco_number-comments', $eco_clean['number-comments']); eco_query($eco_clean['which'], $eco_clean['status'], 'comments', $eco_clean['number-comments'], $eco_clean['posts']); $eco_message = "<strong>{$eco_html['message_which']}</strong> for posts with more than " . "<strong>{$eco_html['number-comments']} comments and/or pings</strong> are now <strong>{$eco_html['status']}</strong>."; break; } //end switch if (true == $eco_clean['auto']) { update_option('eco_auto', 'auto'); if ('for-last' == $eco_clean['for']) { // Only schedule the auto thing if it's a unit of time if ('posts' == $eco_clean['units']) { $eco_message = "<strong>{$eco_html['message_which']}</strong> will be <strong>{$eco_html['opposite_status']}</strong> on the " . " <strong>{$eco_html['last']}</strong> most recent posts." . " {$eco_html['message_which']} on older posts will be <strong>{$eco_html['status_pp']}</strong> each time a new post is published."; } else { // If there isn't already a schedule in place, put one in place // Can't use $auto_check because it's true at this point if (false == ctype_digit(wp_next_scheduled('eco_auto'))) { wp_clear_scheduled_hook('eco_auto'); wp_schedule_event(strtotime('midnight'), 'daily', 'eco_auto'); // first time to run is midnight } $eco_message = "<strong>{$eco_html['message_which']}</strong> on posts older than <strong>{$eco_html['last']} {$eco_html['units']}</strong> will be " . " <strong>{$eco_html['status_pp']}</strong> automatically."; } } elseif ('for-comments' == $eco_clean['for']) { $eco_message = "<strong>{$eco_html['message_which']}</strong> will be <strong>{$eco_html['status_pp']}</strong> " . " on a post once <strong>{$eco_html['number-comments']}</strong> comments and/or pings have been left on it."; } } else { eco_cancel_auto(); } // -------------------------------- SHOW THE RESULTS OF THE QUERY TO THE USER -------------------------------- ?> <div class="wrap"> <h2>Results</h2> <ul> <?php echo "\t<li>{$eco_message}</li>\n"; if ($eco_auto_cancel == true) { echo "\t<li>Your automatic arrangement has been cancelled.</li>\n"; } if ($eco_clean['future'] === true && $eco_clean['for'] != 'for-new') { echo "\t<li>The default setting for <strong>" . strtolower($eco_clean['message_which']); if ('for-last' == $eco_clean['for'] || 'for-comments' == $eco_clean['for']) { echo "</strong> has also been set to <strong>{$eco_html['opposite_status']}</strong>.</li>\n"; } else { echo "</strong> has also been set to <strong>{$eco_html['status']}</strong>.</li>\n"; } } if (!empty($eco_clean['posts']) && $eco_clean['for'] != 'for-new') { echo "\t<li>The following posts were not changed: <ul style='margin-top:5px;'>\n"; $eco_unchanged = explode(',', $eco_html['posts']); foreach ($eco_unchanged as $unch_id) { $unch_id = trim($unch_id); echo '<li><a href="' . get_permalink($unch_id) . '">' . get_the_title($unch_id) . '</a>' . " [<a href='post.php?action=edit&post={$unch_id}'>Edit</a>]</li>\n"; } echo '</ul>'; } ?> </ul> <?php if (DEBUGGING === TRUE) { eco_debugging($eco_html); } } // end if form submitted ?> </div> <!-- end wrap (results) --> <?php }