Ссылка "Просмотреть подробности" в плагине
Как сделать, чтобы ссылка [Просмотреть подробности] отображалась на странице плагина в админке в разделе описания?
Плагин работает нормально, версия и авторы (со ссылками) отображаются корректно, но нет [Просмотреть подробности], как у большинства других плагинов.
Возможно, я задаю неправильный вопрос, но я работаю над плагином и хотел бы отображать readme.txt и скриншоты, как это сделано во многих плагинах. Как сделать, чтобы эта ссылка появилась и показывала содержимое файла readme.txt?
Я читал книгу "Professional WordPress Plugin Development", но не нашел там этой информации. Я могу ссылаться на внешний URI, но мне хотелось бы получить аккуратную панель, которая есть у других плагинов.

Ссылка «Просмотреть сведения» в таблице установленных плагинов отображается только для плагинов, размещенных в репозитории WordPress.org. Если взглянуть на исходный код метода WP_Plugins_List_Table->single_row()
, можно увидеть, что ссылка на сведения генерируется только при наличии данных API, например, если задан slug:
// Ссылка на сведения с использованием данных API, если они доступны
if ( isset( $plugin_data['slug'] ) && current_user_can( 'install_plugins' ) ) {
$plugin_meta[] = sprintf( '<a href="%s" class="thickbox" aria-label="%s" data-title="%s">%s</a>',
esc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data['slug'] .
'&TB_iframe=true&width=600&height=550' ) ),
esc_attr( sprintf( __( 'Дополнительная информация о %s' ), $plugin_name ) ),
esc_attr( $plugin_name ),
__( 'Просмотреть сведения' )
);
} elseif ( ! empty( $plugin_data['PluginURI'] ) ) {
$plugin_meta[] = sprintf( '<a href="%s">%s</a>',
esc_url( $plugin_data['PluginURI'] ),
__( 'Посетить сайт плагина' )
);
}

Вы не указали, размещен ли ваш плагин на WordPress.org или нет, а также установили ли вы плагин из официального каталога WordPress или просто из локального ZIP-архива (что эквивалентно приватно размещенному плагину).
Как уже упоминалось ранее, ссылка "Просмотреть сведения" появляется только для плагинов, чей slug размещен на WordPress.org.
Я хочу подчеркнуть, что бывают ситуации, когда вы можете не увидеть "Просмотреть сведения" даже для плагина, который фактически размещен на WordPress.org.
Как? В какой ситуации?
Пример: представьте, что ваш плагин размещен там, но вы установили его не из каталога плагинов WordPress, а из локального ZIP-файла (например, свежую копию при тестировании нового исправления или доработки).
В моем примере выше установленная копия представляет тот же плагин, но она была установлена не из каталога плагинов WordPress. Она была установлена из локального ZIP-файла, что эквивалентно приватно размещенному плагину.

Если вам действительно нужно, вы можете подключиться к хуку plugin_row_meta
и добавить свою собственную ссылку.
Проблема в том, что обработанный файл README размещается в каталоге плагинов WordPress.
Стандартная ссылка "Просмотреть подробности" содержит /wp-admin/plugin-install.php?tab=plugin-information
, которая по умолчанию вызывает http://api.wordpress.org/plugins/info/
.
Решение / Обходной путь
- Добавьте свою собственную ссылку.
- (Опционально) Подключитесь к ответу API WordPress.
Добавление своей ссылки
Предположим, что вы находитесь в главном файле плагина, добавьте следующий код:
add_filter(
'plugin_row_meta',
function( $plugin_meta, $plugin_file, $plugin_data ) {
if ( __FILE__ === path_join( WP_PLUGIN_DIR, $plugin_file ) ) {
// Здесь вы указываете ссылку на ваш README.
// Я конвертировал свой `readme.txt` в HTML. Подробнее об этом позже...
$url = plugins_url( 'readme.html', __FILE__ );
// Это адаптация части `WP_Plugins_List_Table->single_row()`.
$plugin_meta[] = sprintf(
'<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>',
add_query_arg( 'TB_iframe', 'true', $url ),
esc_attr( sprintf( __( 'Подробнее о %s' ), $plugin_data['Name'] ) ),
esc_attr( $plugin_data['Name'] ),
__( 'Просмотреть подробности' )
);
}
return $plugin_meta;
},
10,
3
);
Подключение к ответу API WordPress
Снова предположим, что вы находитесь в главном файле плагина. Вам нужно добавить ссылку и подключиться к ответу API:
$slug = 'slug-of-your-plugin-or-some-id';
add_filter(
'plugin_row_meta',
function( $plugin_meta, $plugin_file, $plugin_data ) {
if ( __FILE__ === path_join( WP_PLUGIN_DIR, $plugin_file ) ) {
// Это адаптация части `WP_Plugins_List_Table->single_row()`.
$plugin_meta[] = sprintf(
'<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>',
esc_url(
network_admin_url(
"plugin-install.php?tab=plugin-information&plugin=$slug&TB_iframe=true&width=600&height=550"
)
),
esc_attr( sprintf( __( 'Подробнее о %s' ), $plugin_data['Name'] ) ),
esc_attr( $plugin_data['Name'] ),
__( 'Просмотреть подробности' )
);
}
return $plugin_meta;
},
10,
3
);
add_filter(
'plugins_api',
function( $response, $action, $args ) {
if ( 'plugin_information' === $action && $slug === $args->slug ) {
return (object) array(
// Имитируем ответ из каталога плагинов WordPress.
// Для примера запроса можно изучить
// https://api.wordpress.org/plugins/info/1.2/?action=plugin_information&request[slug]=classic-editor
);
}
return $response;
},
10,
3
);
Приложение: Конвертация существующего README
Если вы уже написали свой readme.txt
, не осознавая, что он не будет отображаться (как у меня...), вы можете конвертировать его в HTML и использовать первый фрагмент кода выше.
Добавьте это в ваш package.json
:
{
"main": "Gruntfile.js",
"scripts": {
"readme": "grunt readme"
},
"devDependencies": {
"grunt": "^1.6.1",
"grunt-md2html": "^0.6.1",
"grunt-wp-readme-to-markdown": "^2.1.0"
}
}
А это поместите в ваш Gruntfile.js
:
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
wp_readme_to_markdown: {
your_target: {
files: {
'README.md': 'readme.txt',
},
},
options: {
// Опционально: Только если вы хотите включить скриншоты.
screenshot_url: 'assets/{screenshot}.png',
},
},
md2html: {
your_target: {
files: {
'readme.html': 'README.md',
},
},
},
});
grunt.loadNpmTasks('grunt-wp-readme-to-markdown');
grunt.loadNpmTasks('grunt-md2html');
grunt.registerTask('readme', ['wp_readme_to_markdown', 'md2html']);
};
Теперь выполните npm install && npm run readme
, и вы увидите файл readme.html
в директории вашего плагина.
