source: wordpress/plugins/owark/owark.php @ 68b2159

Revision 68b2159, 12.1 KB checked in by Eric van der Vlist <vdv@dyomedea.com>, 11 years ago (diff)

Adding a table creation and update method.

  • Property mode set to 100644
Line 
1<?php
2/*  Copyright 2011 Eric van der Vlist (vdv@dyomedea.com)
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License, version 2, as
6    published by the Free Software Foundation.
7
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12
13    You should have received a copy of the GNU General Public License
14    along with this program; if not, write to the Free Software
15    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
16*/
17
18/*
19Plugin Name: owark
20Plugin URI: http://owark.org
21Description: Tired of broken links? Archive yours with owark, the Open Web Archive!
22Version: 0.1
23Author: Eric van der Vlist
24Author URI: http://eric.van-der-vlist.com
25License: GLP2
26*/
27
28
29if (!class_exists("Owark")) {
30        class Owark {
31
32        private $broken_links = array();
33        private $post_id = -1;
34        private $post_type = "";
35        private $version = '0.1';
36       
37        /**
38         * Class constructor
39         *
40         * @package owark
41         * @since 0.1
42         *
43         *
44         */
45                function Owark() {
46
47
48            if (is_admin()) {
49                add_action('admin_menu', array($this, 'owark_admin_menu'));
50                add_action('plugins_loaded', array($this, 'sanity_checks'));
51            }
52
53            // See http://stackoverflow.com/questions/2210826/need-help-with-wp-rewrite-in-a-wordpress-plugin
54            // Using a filter instead of an action to create the rewrite rules.
55            // Write rules -> Add query vars -> Recalculate rewrite rules
56            add_filter('rewrite_rules_array', array($this, 'create_rewrite_rules'));
57            add_filter('query_vars',array($this, 'add_query_vars'));
58
59            // Recalculates rewrite rules during admin init to save resources.
60            // Could probably run it once as long as it isn't going to change or check the
61            // $wp_rewrite rules to see if it's active.
62            add_filter('admin_init', array($this, 'flush_rewrite_rules'));
63            add_action( 'template_redirect', array($this, 'template_redirect_intercept') );
64
65            add_filter ( 'the_content', array($this, 'content_filter'));
66            add_filter ( 'comment_text', array($this, 'comment_filter'));
67            add_filter ( 'get_comment_author_link', array($this, 'comment_filter'));
68
69                }
70
71        /**
72         * Check we have everything we need...
73         *
74         * @package owark
75         * @since 0.1
76         *
77         *
78         */
79        function sanity_checks(){
80            $installed_ver = get_option( "owark_db_version" );
81            if ($installed_ver != $this->version) {
82                global $wpdb;
83                $table = $wpdb->prefix."owark";
84                $sql = "CREATE TABLE $table (
85                    id int(10) unsigned NOT NULL AUTO_INCREMENT,
86                    url text NOT NULL,
87                    status varchar(20) NOT NULL DEFAULT 'to-archive',
88                    arc_date datetime,
89                    arc_location text,
90                    PRIMARY KEY(`id`),
91                    KEY `url` (`url`(150)) )";
92                require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
93                dbDelta($sql);
94
95                update_option( "owark_db_version", $this->version );
96
97            }
98        }
99
100        /**
101         * Admin menus
102         *
103         * @package owark
104         * @since 0.1
105         *
106         *
107         */
108        function owark_admin_menu() {
109            add_management_page(__('The Open Web Archive', 'owark'), __('Web Archive', 'owark'), 'edit_others_posts', 'owark', array($this, 'management_page'));
110        }
111
112        /**
113         * URL of an archive page
114         *
115         * @package owark
116         * @since 0.1
117         *
118         *
119         */
120        function get_archive_url($archive_id) {
121            return home_url().'/owark/'.$archive_id;
122        }
123
124        /**
125         * Display the admin/tools page.
126         *
127         * @package owark
128         * @since 0.1
129         *
130         *
131         */
132        function management_page() {
133            //must check that the user has the required capability
134            if (!current_user_can('edit_others_posts')) {
135                wp_die( __('You do not have sufficient permissions to access this page.') );
136            }
137
138            global $wpdb;
139
140            echo '<div class="wrap">';
141            screen_icon();
142            echo '<h2>Owark - The Open Web Archive</h2>';
143            echo '<p><em>Tired of broken links? Archive yours with the Open Web Archive!</em></p>';
144            echo "</div>";
145
146            echo '<p>List of broken links with successfully archived pages:</p>';
147
148            $query = "SELECT owark.id, owark.url, owark.status, owark.arc_date, owark.arc_location, blc_links.status_text
149                        FROM {$wpdb->prefix}perwac AS owark, {$wpdb->prefix}blc_links as blc_links
150                        WHERE owark.url = blc_links.final_url COLLATE latin1_swedish_ci and blc_links.broken = 1
151                        ORDER BY owark.url";
152            $results = $wpdb->get_results($query);
153
154            echo '<table class="widefat">';
155            echo '<thead>';
156            echo '<tr>';
157            echo '<th>URL</th>';
158            echo '<th>Archive</th>';
159            echo '</tr>';
160            echo '</thead>';
161            echo '<tbody>';
162
163            foreach ($results as $link) {
164                $archive_url = $this->get_archive_url($link->id);
165                echo "<tr>
166                        <td><a href=\"{$link->url}\" target='_blank'>{$link->url}</a></td>
167                        <td><a href=\"{$archive_url}\" target='_blank'>{$link->arc_date}</a></td>
168                    </tr>";
169            }
170
171            echo '</tbody>';
172            echo '</table>';
173
174
175        }
176
177        /**
178         * Add a rewrite rule to display archive pages
179         *
180         * @package owark
181         * @since 0.1
182         *
183         *
184         */
185        function create_rewrite_rules($rules) {
186            global $wp_rewrite;
187            $newRule = array('owark/(.+)' => 'index.php?owark='.$wp_rewrite->preg_index(1));
188            $newRules = $newRule + $rules;
189            return $newRules;
190        }
191
192        /**
193         * Add a query variable used to display archive pages
194         *
195         * @package owark
196         * @since 0.1
197         *
198         *
199         */
200        function add_query_vars($qvars) {
201            $qvars[] = 'owark';
202            return $qvars;
203        }
204
205        /**
206         * Title says it all ;) ...
207         *
208         * @package owark
209         * @since 0.1
210         *
211         *
212         */
213        function flush_rewrite_rules() {
214            global $wp_rewrite;
215            $wp_rewrite->flush_rules();
216        }
217
218        /**
219         * Intercepts archive pages.
220         *
221         * @package owark
222         * @since 0.1
223         *
224         *
225         */
226        function template_redirect_intercept() {
227            global $wp_query;
228            if ($wp_query->get('owark')) {
229                $this->display_archive($wp_query->get('owark'));
230                exit;
231            }
232        }
233
234        /**
235         * Filter to replace broken links in comments.
236         *
237         * @package owark
238         * @since 0.1
239         *
240         *
241         */
242        function content_filter($content) {
243            global $post;
244            return $this->link_filter($content, $post->ID, $post->post_type);
245        }
246
247        /**
248         * Filter to replace broken links in comments.
249         *
250         * @package owark
251         * @since 0.1
252         *
253         *
254         */
255        function comment_filter($content) {
256            return $this->link_filter($content, get_comment_ID(), 'comment');
257        }
258
259        /**
260         * Generic filter to replace broken links in content.
261         *
262         * @package owark
263         * @since 0.1
264         *
265         *
266         */
267        function link_filter($content, $post_id, $post_type) {
268
269            global $wpdb;
270
271            // See if we haven't already loaded the broken links for this post...
272            if ($this->post_id != $post_id || $this->post_type != $post_type) {
273
274                $this->post_id =  $post_id;
275                $this->post_type = $post_type;
276
277                //Retrieve info about all occurrences of broken links in the current post
278                //which happens for comments (they have links to check in 2 different filters)
279                $q = "
280                    SELECT instances.raw_url, owark.id
281                    FROM {$wpdb->prefix}blc_instances AS instances,
282                        {$wpdb->prefix}blc_links AS links,
283                        {$wpdb->prefix}perwac AS owark
284                    WHERE
285                        instances.link_id = links.link_id
286                        AND owark.url = links.final_url COLLATE latin1_swedish_ci
287                        AND instances.container_id = %s
288                        AND instances.container_type = %s
289                        AND links.broken = 1
290                ";
291                $q = $wpdb->prepare($q, $this->post_id, $this->post_type);
292                $results = $wpdb->get_results($q);
293
294                $this->broken_links = array();
295
296                foreach ($results as $link) {
297                    $this->broken_links[$link->raw_url] = $link->id;
298                }
299
300            }
301
302
303            if (empty($this->broken_links)) {
304                return $content;
305            }
306
307            // Regexp : see http://stackoverflow.com/questions/2609095/hooking-into-comment-text-to-add-surrounding-tag
308            return preg_replace_callback('/(<a.*?href\s*=\s*["\'])([^"\'>]+)(["\'][^>]*>.*?<\/a>)/si', array( $this, 'replace_a_link'), $content);
309        }
310
311        /**
312         * Replace a link.
313         *
314         * @package owark
315         * @since 0.1
316         *
317         *
318         */
319        function replace_a_link($matches) {
320            if (array_key_exists($matches[2], $this->broken_links)) {
321                return $matches[1].$this->get_archive_url($this->broken_links[$matches[2]]).$matches[3];
322            } else {
323                return $matches[0];
324            }
325        }
326
327
328        /**
329         * Display an archive page
330         *
331         * @package owark
332         * @since 0.1
333         *
334         *
335         */
336        function display_archive($parameter) {
337
338            global $wpdb;
339
340            $id = intval($parameter);
341
342            $query = "SELECT *
343                        from {$wpdb->prefix}perwac AS owark
344                        where id = {$id}";
345            $link = $wpdb->get_row($query);
346
347            $blog_title = get_bloginfo('name');
348            $home_url = home_url();
349
350            $loc = "";
351            if( ($pos = strpos($link->arc_location, '/wp-content/perwac/')) !== FALSE )
352                $loc = substr($link->arc_location, $pos);
353            $arc_loc = home_url() . $loc;
354
355            echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
356        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
357<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
358
359            echo "<base href=\"{$arc_loc}/\">";
360            echo '<div style="background:#fff;border:1px solid #999;margin:-1px -1px 0;padding:0;">';
361            echo '<div style="background:#ddd;border:1px solid #999;color:#000;font:13px arial,sans-serif;font-weight:normal;margin:12px;padding:8px;text-align:left">';
362            echo "This is an <a href='http://owark.org'>Open Web Archive</a> archive of <a href=\"{$link->url}\">{$link->url}</a>.";
363            echo "<br />This snapshot has been taken on {$link->arc_date} for the website <a href=\"{$home_url}\">{$blog_title}</a> which contains a link to this page and has saved a copy to be displayed in the page ever disappears.";
364            echo '</div></div><div style="position:relative">';
365            $file_location = '.'.$loc.'/index.html';
366            $f = fopen($file_location, "r");
367            echo fread($f, filesize($file_location));
368            fclose($f);
369            echo '</div>';
370        }
371
372
373        }
374}
375
376
377if (class_exists("Owark")) {
378        $owark = new Owark();
379}
380
381
382
383?>
Note: See TracBrowser for help on using the repository browser.