如何找到插件的子弹?


11

我想知道如何找到插件的slug(slug = WordPress用于进行插件更新并确定当前处于活动状态的插件的内部名称)?它通常是插件的文件夹名,但是如果插件没有文件夹,则是其文件名(如hello.php)。还有其他例外吗?

  1. 小写和大写字符重要吗?
  2. 插件可以具有不同于其文件夹名称的子插件吗?如果有一个名为hello.php和另一个/hello.php/hello.php的插件怎么办?

很好的问题,很遗憾我们不能授予Q赏金,但我想A才是奖励;)
brasofilo

Answers:


8

WordPress中用于标识插件的字符串为:

plugin_basename($file);

…哪里$file带有插件标头的文件

因此,如果您使用的是插件,请通过以下方式获得该插件:

$slug = plugin_basename( __FILE__ );

1
plugin_basename($ file); 自从3.8.1起,它不再是the弹。这是文件夹/plugin_main_file.php路径。由于插件Akismet的“ slug”不是“ akismet / akismet.php”,而是“ akismet”。
杰夫·马特森

3
无论哪种情况,这都不是正确的答案。
majick '16

@majick是的,对于Wordpress 4.7.4来说,这不是答案
Marecky

2
生成插件插件的另一种方法是使用dirname(plugin_basename(__FILE__))
ilanco

2

如果安装WP-CLI,则可以从命令行获取带有其插件和版本的插件列表:

> wp plugin list

我知道这可能不是您想要的,如果您需要在代码中找到该段代码,但这在使用TGM-Plugin-Activation插件时对我有帮助。

我发现在没有WP-CLI的情况下很难使用WordPress,通常,它是用于与WordPress相关的许多常见任务的非常有用的工具。


2

插件(主)文件和插件的子弹之间的区别是WordPress Codex可以做得更好的地方。我最近才感觉到您的困惑(感到沮丧)。

这是我通过对WordPress核心代码进行一些“侦探工作”而学到的。

插件文件

这是WordPress识别和记录插件的独特方式。它由插件的目录和主插件文件(文件头包含各种插件详细信息,例如版本,作者等)组成。

它看起来像这样: your-plugin-directory/main-file.php

如果查看活动的插件数据(由返回get_option( 'active_plugins' )),您会发现WordPress仅需要此插件文件即可正确识别插件。

您可以选择将其视为插件的主文件相对路径(相对于该wp-content/plugins/目录)。您可以使用以下内容“组成”主插件文件的绝对路径:trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

核心本身会生成插件文件,如下所示:

$plugin_main_file = plugin_basename( trim( $plugin_main_file_absolute_path ) );

插件

有人希望插件“ slug”是该插件的某种标准化ID,例如post slug用于发布-因此,您可以使用此“ slug”将其提供给WordPress核心功能并使事情进展。

并不是的。在搜索内核中关于插件的引用(或重要的主题)并且几乎什么都没找到之后,我想我对此有所了解。

唯一真正的蛞蝓是那些东西通过一个唯一的URL访问:文章,页面,分类等,这是接受的东西(比如文章标题)的名称和生成一个URL友好的版本整点:在使用放在网址中。

但是,我们在URL的哪里使用主题/插件“子弹”?

我们不会在单个WordPress安装上执行此操作-WP管理员或前端中都不会执行此操作。

但是,有一个地方与WordPress代码WordPress.org网站非常纠缠人们很难区分这两者,包括在开发人员中以某种方式普遍认为WordPress.org主题或插件插件应与帖子或页面插件相同。

它们具有相同的目的,但位于不同的网站上。在WordPress.org上,它们用于从其他主题中唯一标识一个主题,并从其余主题中唯一标识一个插件(如URL https://wordpress.org/plugins/akismet/)。

但是,当涉及到单个 WordPress安装时,由于没有权限执行(例如在WordPress.org上),无法保证相同的唯一性。如果所有插件和主题都来自WordPress.org,则可能会起作用,但值得庆幸的是事实并非如此。

WordPress代码与主题/插件块有什么关系?

WordPress核心代码不依赖主题/插件插件来执行安装,激活,更新,删除主题或插件之类的操作。

对于主题,它依赖于主题目录,因为主题的主要入口是style.css文件(您不能使用其他CSS文件保存主题详细信息标题)。

对于插件,它依赖于插件目录和主插件文件,因为插件可以随意调用其主文件。

核心使用主题/插件插件的唯一目的是从WordPress.org目录中处理主题和插件时:获取插件列表,检查更新,向目录使用情况数据报告等等。


总结一下关于插件的信息:每当您找到带有slug条目的插件数据时,有99%的时间将引用插件WordPress.org信息。

我们如何确定插件?

如果要以编程方式激活,更新,停用或删除WordPress安装上的某个插件,则需要使用该插件文件。您可以从插件的主文件中获得以下内容:

$plugin_file = plugin_basename( __FILE__ );

如果要从另一个插件中定位某个插件,则事情会变得有些棘手,因为您需要依靠一些“猜测”。

您可以对插件名称进行硬编码,在所有插件列表中搜索插件(请参阅get_plugins()),然后从那里获取插件文件。

如果你知道一个类或函数,由插件,您可以使用反射定义(见这个答案类和这一次的功能)。


希望这对您和其他可能很难处理“插件”的人有所帮助。它可以节省我几个小时:)


0

只是为了澄清自原始帖子。

我找到插件的方法是,首先导航到您的插件文件夹,然后打开与该插件关联的文件夹,最后找到包含以下代码的文件。找到该文件后,文件名减去扩展名即为您的插件。

例如,如果我在名为advanced-plugin-awesomeness.php的文件中找到以下代码,则我的头衔会是Advanced-plugin-awesomeness。

希望这可以帮助!

/*
Plugin Name: Name of plugin here
Version: 2.4.6
Description: plugin description here
Author: plugin author here

-1,尽管大多数文件名和目录都匹配,但这不是一种可靠的方法,因为update slug实际上是目录-不是文件名(除非没有目录。)
majick

甚至没有目录!看到我更新的答案,它实际上来自于插件名称。
majick '16

0

不幸的是,该子弹是通过Update API返回的,除非您查询API本身,否则此问题的答案并不那么明显。但是,如果您想查看当前插件列表和相关插件数据的列表,则只需执行以下操作:

print_r(get_site_transient('update_plugins'));

但是,这将在另外12个小时内不再提供有关新安装的插件的信息,您将不得不对它们进行其他操作,例如。使用的代码修改后的版本从wp_update_pluginswp-includes/update.php...

完成此测试后,似乎可以确认,无论插件文件名,位置或大写字母如何,实际上都是由Plugin Name生成更新包的,很可能是通过sanitize_title。因此,我认为正确的答案应该是:

// if you have the plugin basename:
// $pluginfile = WP_PLUGIN_DIR.'/'.$pluginbasename;

// otherwise if you have the absolute path already:
$plugin = get_plugin_data($pluginfile);
$pluginslug = sanitize_title($plugin['Name']);

+1,还有一点需要注意的是,随着wordpress.org小组明确表示,段塞计算方法尚未完全确定,这种情况可能会随着时间而改变
Mark Kaplun

我不确定这是否正确,我尝试为插件执行此操作,但是失败了:返回的插件名称为“ Responsive WordPress Slider-Soliloquy Lite”,子弹为:soliloquy-lite
Chris

我怀疑这是因为在插件提交到存储库时生成了子弹,并且以后不会更改名称...在大多数情况下,它确实与目录名称匹配,但是如果两者都存在例外,则可以一个或另一个。这不是很理想:-/
majick '16

0

您可以通过将DIR传递给plugin_basename()来获得插件的文件夹名称(PHP5.3 + ),如下所示:

$plugin_foldername = plugin_basename( __DIR__ );

0

尝试这个:

function get_slugname(){
    $tmp = array();
    $plugins_all = get_plugins() ;
    $plugin_slug = explode('/',dirname(plugin_basename(__FILE__)));
    foreach ($plugins_all as $key=>$value) {
        if ($plugin_slug[0] == explode('/',$key)[0] ) {
        $tmp = $value;
        $tmp['slug'] = explode('/',$key)[0];
        $tmp['file'] = explode('/',$key)[1];
        }
    }
return $tmp;
}

1
编辑您的答案,并添加此代码的解释。
内森·约翰逊

0

对于大多数插件,“ slug”将与目录名称相同。尽管.org用户可以将目录名称设置为他们想要的任何名称。

$slug = (dirname(plugin_basename(__FILE__)));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.