В настоящее время я работаю над плагином WordPress, который отображает популярные сообщения по просмотру или комментариям. Я знаю, что это было сделано в других плагинах, но я использую этот проект как возможность изучить разработку плагинов, поскольку я новичок в WordPress.Параметры страницы плагина WordPress страницы
У меня, похоже, частично работает плагин, но я столкнулся с тем, что, по моему мнению, является проблемой с областью. На странице параметров плагина у меня установлен переключатель, который пользователь может использовать для отображения сообщений по просмотрам или комментариям. Я использую значение переключателя в инструкции if else в моем плагине, чтобы включить правильные аргументы и отобразить в виджетах.
Я могу захватить значение переключателя на странице настроек, но инструкция плагина if else, похоже, не видит эти значения, поэтому ничего не отображается в виджетах.
Вот содержимое моего плагина PHP файла:
<?php
/**
* Plugin Name: Popularity
* Description: Popular Posts Plugin
* Version: 0.1
* Author: Daniel
* Author URI: wordpress.org
* License: GPL2
*/
include 'popularity-settings.php';
/* Post Popularity Counter */
function post_views($postID) {
$total_key = 'views';
// Get current 'views' field
$total = get_post_meta($postID, $total_key, true);
// If current 'views' field is empty, set it to zero
if ($total == '') {
delete_post_meta($postID, $total_key);
add_post_meta($postID, $total_key, '0');
} else {
// If current 'views' field has a value, add 1 to that value
$total++;
update_post_meta($postID, $total_key, $total);
}
}
/* Dynamically inject counter into single posts */
function count_popular_posts($post_id) {
// Check that this is a single post and that the user is a visitor
if (!is_single()) return;
if (!is_user_logged_in()) {
// Get the post ID
if (empty($post_id)) {
global $post;
$post_id = $post->ID;
}
// Run Post Counter on post
post_views($post_id);
}
}
add_action('wp_head', 'count_popular_posts');
/* Add popular post function data to All Posts table */
function add_views_column($defaults) {
$defaults['post_views'] = 'View Count';
return $defaults;
}
add_filter('manage_posts_columns', 'add_views_column');
function display_views($column_name) {
if ($column_name === 'post_views') {
echo (int) get_post_meta(get_the_ID(), 'views', true);
}
}
add_action('manage_posts_custom_column', 'display_views', 5, 2);
/* Adds Popular Posts widget */
class popular_posts extends WP_Widget {
/* Register widget with WordPress */
function __construct() {
parent::__construct(
'popular_posts', // Base ID
__('Popular Posts', 'text_domain'), // Name
array('description' => __('Displays the 5 most popular posts', 'text_domain'),) // Args
);
}
/* Front-end display of widget */
public function widget($args, $instance) {
echo $args['before_widget'];
if (! empty($instance['title'])) {
echo $args['before_title'] . apply_filters('widget_title', $instance['title']). $args['after_title'];
}
// Query args
if ($myplugin_options['orderby'] == 'views') {
$query_args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 5,
'order' => 'DESC',
'meta_key' => 'views',
'orderby' => 'meta_value_num',
'ignore_sticky_posts' => true
);
} else if ($myplugin_options['orderby'] == 'comments') {
$query_args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 5,
'order' => 'DESC',
'orderby' => 'comment_count',
'ignore_sticky_posts' => true
);
}
// The Query
$the_query = new WP_Query($query_args);
// The Loop
if ($the_query->have_posts()) {
echo '<ul>';
while ($the_query->have_posts()) {
$the_query->the_post();
echo '<li>';
echo '<a href="' . get_the_permalink() . '" rel="bookmark">';
echo get_the_title();
if ($myplugin_options['orderby'] == 'views') {
echo ' (' . get_post_meta(get_the_ID(), 'views', true) . ')';
} else if ($myplugin_options['orderby'] == 'comments') {
echo comments_number(' (0)', ' (1)', ' (%)');
}
echo '</a>';
echo '</li>';
}
echo '</ul>';
echo $myplugin_options['orderby'];
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
echo $args['after_widget'];
}
/* Back-end widget form */
public function form($instance) {
if (isset($instance[ 'title' ])) {
$title = $instance[ 'title' ];
}
else {
$title = __('Popular Posts', 'text_domain');
}
?>
<p>
<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
<input id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>">
</p>
<?php
}
/* Sanitize widget form values as they are saved */
public function update($new_instance, $old_instance) {
$instance = array();
$instance['title'] = (! empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
return $instance;
}
} // class popular_posts
// register popular_posts widget
function register_popular_posts_widget() {
register_widget('popular_posts');
}
add_action('widgets_init', 'register_popular_posts_widget');
?>
А вот содержимое моей настройки PHP файла:
<?php
// create custom plugin settings menu
add_action('admin_menu', 'myplugin_create_menu');
function myplugin_create_menu() {
//create new top-level menu
add_menu_page('Plugin Options', 'Plugin Options', 'manage_options', 'myplugin_main_menu', 'myplugin_settings_page', plugins_url('/images/wordpress.png', __FILE__));
//call register settings function
add_action('admin_init', 'myplugin_register_settings');
}
function myplugin_register_settings() {
//register our settings
register_setting('myplugin-settings-group', 'myplugin_options', 'myplugin_sanitize_options');
}
function myplugin_sanitize_options($input) {
return $input;
}
function myplugin_settings_page() {
?>
<div class="wrap">
<h2>Popularity Plugin Options</h2>
<form method="post" action="options.php">
<?php settings_fields('myplugin-settings-group'); ?>
<?php $myplugin_options = get_option('myplugin_options'); ?>
<h3>Order popular posts by</h3>
<table class="form-table">
<tr valign="top">
<th scope="row">Views</th>
<td><input name="myplugin_options[orderby]" type="radio" value="views"/></td>
</tr>
<tr valign="top">
<th scope="row">Comments</th>
<td><input name="myplugin_options[orderby]" type="radio" value="comments"/></td>
</tr>
</table>
<?php echo $myplugin_options['orderby']; ?>
<p class="submit">
<input type="submit" class="button-primary" value="Save Changes" />
</p>
</form>
</div>
<?php
}
?>
Заранее спасибо за любые указатели вы могли бы иметь для меня. Это моя первая попытка разработки любого типа плагинов, и я все еще изучаю PHP, как я уверен, вы можете сказать.
Вау, это было именно проблема. Спасибо, что указали это. Теперь, если я смогу выяснить, как включить переключатель в настройках. У меня было это в какой-то момент, но теперь это не спасение. –
Настройки виджета сохраняются в методе 'update()'. Вероятно, вы должны сделать что-то вроде 'update_option ('myplugin_options', $ new_array)' – diggy
Я снова заработал их, добавив Php checked ('views' == $ myplugin_options [orderby]); ?> на каждый вход. –