· 7 years ago · Nov 05, 2018, 06:52 AM
1<?php
2/*
3Plugin Name: wRandom banner
4Plugin URI: none
5Description: Rotated banner with saving choice on each page
6Author: Denis Nikiforov
7Author URI: http://wirgen.by/
8Version: 1.0
9*/
10
11global $banner_random_db_version;
12$banner_random_db_version = '1.0';
13
14register_activation_hook( __FILE__, 'banner_random_install' );
15
16add_action( 'init', 'banner_random_create_post_type' );
17add_action( 'admin_init', 'banner_random_post_delete' );
18add_action( 'add_meta_boxes', 'banner_random_meta_boxes' );
19add_action( 'save_post' , 'banner_random_meta_save' );
20add_action( 'admin_init', 'banner_random_clear_action_callback' );
21
22add_filter( 'post_row_actions', 'banner_random_clear_action', 10, 2 );
23add_filter( 'manage_banner_random_posts_columns', 'banner_random_columns_head' );
24add_action( 'manage_banner_random_posts_custom_column', 'banner_random_columns_content', 10, 2 );
25
26add_shortcode('banner-random', 'banner_random_output');
27
28function banner_random_install() {
29 global $wpdb;
30 global $banner_random_db_version;
31
32 $table_name = $wpdb->prefix . "banner_random";
33 $charset_collate = $wpdb->get_charset_collate();
34
35 $sql = "CREATE TABLE IF NOT EXISTS $table_name (
36 `id` int(11) NOT NULL AUTO_INCREMENT,
37 `banner_id` int(11) NOT NULL,
38 `post_id` int(11) NOT NULL,
39 `string` text NOT NULL,
40 PRIMARY KEY (id)
41 ) $charset_collate;";
42
43 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
44 dbDelta( $sql );
45
46 add_option( 'banner_random_db_version', $banner_random_db_version );
47
48 register_uninstall_hook( __FILE__, 'banner_random_uninstall' );
49}
50
51function banner_random_uninstall() {
52 global $wpdb;
53
54 $table_name = $wpdb->prefix . "banner_random";
55 $wpdb->query("DROP TABLE $table_name");
56}
57
58function banner_random_create_post_type() {
59 register_post_type( 'banner_random',
60 array(
61 'labels' => array(
62 'name' => __( 'Random banners', 'banner_random' ),
63 'singular_name' => __( 'Random banner', 'banner_random' )
64 ),
65 'public' => false,
66 'show_ui' => true,
67 'supports' => [ 'title', 'thumbnail' ],
68 )
69 );
70}
71
72function banner_random_post_delete( $post_id ) {
73 global $wpdb;
74
75 $table_name = $wpdb->prefix . "banner_random";
76 $wpdb->query('DELETE FROM ' . $table_name . ' WHERE `banner_id` = ' . $post_id);
77}
78
79function banner_random_meta_boxes( $post_type ) {
80 if ( $post_type == 'banner_random' )
81 add_meta_box('wbr_text_meta', __( 'Text', 'banner_random' ), 'banner_random_text_meta', 'banner_random' );
82}
83
84function banner_random_text_meta( $post ) {
85 wp_nonce_field( plugin_basename(__FILE__), 'banner_random_nonce' );
86
87 $text = get_post_meta( $post->ID, '_wbr_text_meta', true );
88
89 echo '<textarea id="banner_random_text" name="banner_random_text" rows="10" style="width:100%;">' . $text . '</textarea>';
90 echo '<p class="howto">По одному предложению на каждую Ñтроку</p>';
91}
92
93function banner_random_meta_save( $post_id ) {
94 if ( ! wp_verify_nonce( $_POST['banner_random_nonce'], plugin_basename(__FILE__) ) )
95 return $post_id;
96
97 if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
98 return $post_id;
99
100 if ( 'banner_random' == $_POST['post_type'] && ! current_user_can( 'edit_page', $post_id ) ) {
101 return $post_id;
102 } elseif( ! current_user_can( 'edit_post', $post_id ) ) {
103 return $post_id;
104 }
105
106 if ( ! isset( $_POST['banner_random_text'] ) )
107 return;
108
109 $text = $_POST['banner_random_text'];
110 update_post_meta( $post_id, '_wbr_text_meta', $text );
111}
112
113function banner_random_clear_action( $actions, $post ) {
114 if ( $post->post_type == 'banner_random' ) {
115 $url = add_query_arg(
116 array(
117 'post_id' => $post->ID,
118 'action' => 'clear_references',
119 )
120 );
121
122 $actions['clear'] = '<a href="' . esc_url( $url ) . '">' . __( 'Clear references', 'banner_random' ) . '</a>';
123 }
124
125 return $actions;
126}
127
128function banner_random_columns_head( $columns ) {
129 $temp = array(
130 'cb' => $columns['cb'],
131 'title' => $columns['title'],
132 'wbr_shortcode' => __( 'Shortcode', 'banner_random' ),
133 );
134 array_shift($columns);
135 array_shift($columns);
136 $columns = array_merge($temp, $columns);
137
138 if ( isset( $_GET['clear_msg'] ) ) {
139 add_action( 'admin_notices', function() {
140 $banner = get_post( $_GET['clear_msg'] );
141 echo '<div class="notice notice-success is-dismissible"><p>' . sprintf( __( 'Banner <b>%s</b> references cleared successful.', 'banner_random' ), $banner->post_title ) . '</p></div>';
142 } );
143 }
144
145 return $columns;
146}
147
148function banner_random_columns_content( $column_name, $post_id ) {
149 if ( $column_name == 'wbr_shortcode' ) {
150 echo '[banner-random id="' . $post_id . '"]';
151 }
152}
153
154function banner_random_clear_action_callback() {
155 if( $_GET['post_type'] != 'banner_random' )
156 return;
157
158 if( isset( $_GET['action'] ) && isset( $_GET['post_id'] ) && ( $_GET['action'] == 'clear_references' ) ) {
159 global $wpdb;
160
161 $table_name = $wpdb->prefix . "banner_random";
162 $wpdb->query('DELETE FROM ' . $table_name . ' WHERE `banner_id` = ' . $_GET['post_id']);
163
164 if ( wp_redirect(admin_url('edit.php?post_type=banner_random&clear_msg=' . $_GET['post_id']), 301) )
165 exit;
166 }
167}
168
169function banner_random_output( $atts ) {
170 if ( ! isset( $atts['id'] ) )
171 return '';
172
173 global $post;
174 global $wpdb;
175
176 $post_id = $post->ID;
177 $table_name = $wpdb->prefix . "banner_random";
178
179 $banner = $wpdb->get_row("SELECT * FROM $table_name WHERE `banner_id` = {$atts['id']} AND `post_id` = $post_id");
180 if ( $banner == null ) {
181 $banner = get_post( $atts['id'] );
182 if ( $banner->post_type != 'banner_random' ) {
183 return '';
184 }
185 $banner->banner_id = $banner->ID;
186 $banner->post_id = $post_id;
187
188 $strings = explode( "\n", str_replace( "\r", '', get_post_meta( $banner->ID, '_wbr_text_meta', true ) ) );
189 $banner->string = $strings[ mt_rand( 0, count( $strings )-1 ) ];
190
191 $wpdb->insert(
192 $table_name,
193 array( 'banner_id' => $banner->banner_id, 'post_id' => $banner->post_id, 'string' => $banner->string ),
194 array( '%d', '%d', '%s' )
195 );
196 }
197
198 $post_thumbnail_id = get_post_thumbnail_id( $banner->banner_id );
199 if ( $post_thumbnail_id ) {
200 $thumbnail = wp_get_attachment_image( $post_thumbnail_id, 'full' );
201 } else {
202 $thumbnail = '';
203 }
204
205 return '<div id="rbanner' . $banner->banner_id . '" class="box banner_random">
206 ' . $thumbnail . '
207 <div class="box-text">' . $banner->string . '</div>
208 </div>';
209}