¿Cómo puedo encontrar la babosa de complementos?

11

Me pregunto cómo puedo encontrar el slug de los complementos (slug = nombre interno utilizado por WordPress para hacer actualizaciones de complementos y determinar qué complementos están actualmente activos). Generalmente es el nombre de la carpeta del complemento, pero si un complemento no tiene una carpeta, es su nombre de archivo (como hello.php). ¿Hay alguna otra excepción?

  1. ¿Importan los caracteres en minúsculas y mayúsculas?
  2. ¿Puede un complemento tener un slug diferente al nombre de su carpeta? ¿Qué pasa si hay un complemento llamado hello.php y otro /hello.php/hello.php?
Pablo
fuente
Muy buena pregunta, lástima que no podamos otorgar recompensas a Q's, pero supongo que la A es el premio;)
brasofilo

Respuestas:

8

La cadena utilizada en WordPress para identificar el complemento es:

plugin_basename($file);

... donde $filehay un archivo con los encabezados del complemento .

Entonces, si está en su complemento, obtenga la babosa con:

$slug = plugin_basename( __FILE__ );
fuxia
fuente
1
plugin_basename ($ archivo); No es la babosa desde 3.8.1. Esta es la ruta de la carpeta / plugin_main_file.php. Como la "babosa" del complemento Akismet no es "akismet / akismet.php" sino que es "akismet".
Jeff Mattson
3
esta ya no es la respuesta correcta en ninguno de los casos.
majick
@majick true, para Wordpress 4.7.4 no es la respuesta
Marecky
2
Otra forma de generar el plugin slug es mediante el uso dirname(plugin_basename(__FILE__)).
ilanco
2

Si instala WP-CLI , puede obtener la lista de complementos con su slug y versión desde la línea de comandos:

> wp plugin list

Sé que probablemente no sea lo que quieres, si necesitas encontrar la babosa en el código, pero me ha ayudado mientras trabajas con el complemento TGM-Plugin-Activation.

Me resulta difícil trabajar con WordPress sin la WP-CLI, en general es una herramienta muy útil para muchas tareas comunes relacionadas con WordPress.

Thomas Bindzus
fuente
2

La diferencia entre el archivo del complemento (principal) y la babosa del complemento es un lugar donde el Codex de WordPress podría funcionar mucho mejor. Entiendo tu confusión ya que la he sentido demasiado recientemente (mezclada con frustración).

Esto es lo que aprendí haciendo un "trabajo de detective" en el código central de WordPress.

El archivo de complemento

Esta es la forma única en que WordPress identifica y registra un complemento. Está compuesto por el directorio del complemento Y el archivo del complemento principal (el que tiene el encabezado del archivo que contiene los diversos detalles del complemento, como la versión, el autor, etc.).

Se vería algo así: your-plugin-directory/main-file.php

Si observa los datos de complementos activos (devueltos por get_option( 'active_plugins' )), verá que WordPress solo necesita este archivo de complemento para identificar los complementos correctamente.

Puede optar por considerarlo como la ruta relativa del archivo principal de su complemento (en relación con el wp-content/plugins/directorio que es). Puede "componer" la ruta absoluta del archivo de complemento principal con algo como esto:trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

El núcleo mismo genera el archivo de complemento de esta manera:

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

La babosa del complemento

Uno esperaría que el plugin "slug" sea una especie de ID estandarizada para el plugin como el post slug es para publicaciones, por lo que podría usar este "slug" para proporcionarlo a las funciones principales de WordPress y hacer que las cosas funcionen.

Realmente no. Después de buscar en el núcleo referencias a las babosas de plugins (o temas para lo que importa) y no encontrar casi nada, creo que lo entiendo.

Las únicas babosas reales son aquellas para cosas accesibles a través de una URL única: publicaciones, páginas, taxonomías, etc. Ese es el objetivo de tomar el nombre de algo (como el título de una publicación) y generar una versión amigable de URL de eso: usar en una URL

Pero, ¿dónde usamos "slugs" de tema / complementos en las URL?

No hacemos eso en instalaciones individuales de WordPress, ni en el administrador de WP ni en la interfaz.

Sin embargo, hay un lugar muy enredado con el código de WordPress, el sitio de WordPress.org. La gente está teniendo dificultades para distinguir entre los dos, incluido que de alguna manera se hizo común entre los desarrolladores considerar que el tema de WordPress.org o las babosas de complementos deberían funcionar de la misma manera que una publicación o babosa de página.

Sirven para el mismo propósito pero en sitios web separados . En WordPress.org se usan para identificar de forma exclusiva un tema de otros y un complemento del resto (en URL como https://wordpress.org/plugins/akismet/).

Pero cuando se trata de instalaciones individuales de WordPress, no se puede garantizar la misma singularidad porque no hay autoridad para hacerla cumplir (como en WordPress.org). Podría funcionar si todos los complementos y temas vinieran de WordPress.org, pero afortunadamente ese no es el caso.

¿Qué hace el código de WordPress con las babosas de tema / complemento?

El código central de WordPress no se basa en los slugs de tema / complemento para hacer cosas como instalar, activar, actualizar, eliminar temas o complementos.

Para los temas, se basa en el directorio de temas ya que el punto de entrada principal en un tema es el style.cssarchivo (no puede usar otro archivo CSS para contener el encabezado de detalles del tema).

Para los complementos, se basa en el directorio de complementos Y en el archivo principal de complementos , ya que los complementos pueden llamar a su archivo principal como quieran.

Lo único para lo que el núcleo usa los slugs de tema / complementos es cuando maneja temas y complementos desde el directorio de WordPress.org: obtener listas de complementos, buscar actualizaciones, informar a los datos de uso del directorio, etc.


Para concluir sobre las babosas de complementos: cada vez que encuentre datos de complementos con la slugentrada, el 99% del tiempo se referirá a la babosa de WordPress.org del complemento.

¿Cómo hacemos para identificar los complementos?

Si desea activar, actualizar, desactivar o eliminar mediante programación un determinado complemento en una instalación de WordPress, debe utilizar el archivo de complemento. Puede obtenerlo así desde el archivo principal de su complemento:

$plugin_file = plugin_basename( __FILE__ );

Si desea apuntar a un determinado complemento de otro complemento, las cosas se ponen un poco más complicadas ya que necesita confiar en un poco de "conjeturas".

Puede codificar el nombre del complemento, buscar el complemento en la lista de todos los complementos (consulte get_plugins () ) y obtener el archivo del complemento desde allí.

Si conoce una clase o función definida por ese complemento, podría usar la reflexión (consulte esta respuesta para las clases y esta para las funciones).


Espero que esto te ayude a ti y a otras personas que puedan tener dificultades para lidiar con las "babosas de plugins". Podría haberme ahorrado un par de horas :)

Vlad Olaru
fuente
0

Solo para aclarar desde la publicación original.

La forma en que he encontrado el plugin slug es primero navegando a su carpeta de complementos, luego abriendo la carpeta asociada con el complemento y finalmente encontrando el archivo que contiene el siguiente código. Una vez que haya encontrado este archivo, el nombre del archivo menos la extensión debe ser su slug plugin.

Por ejemplo, si encontré el siguiente código en un archivo llamado advanced-plugin-awesomeness.php, mi slug sería advanced-plugin-awesomeness.

¡Espero que esto ayude!

/*
Plugin Name: Name of plugin here
Version: 2.4.6
Description: plugin description here
Author: plugin author here
Pastel de carne4
fuente
-1 ya que si bien la mayoría de los nombres de archivos y directorios coinciden, este no es un método confiable ya que la ficha de actualización es en realidad el directorio, no el nombre de archivo (a menos que no haya un directorio)
Majick
o ni siquiera el directorio! vea mi respuesta actualizada, en realidad proviene del nombre del complemento.
majick
0

Desafortunadamente, el slug se devuelve a través de la API de actualización, la respuesta a esta pregunta no es tan obvia a menos que consulte la API en sí. Sin embargo, si desea ver una lista de sus babosas de complementos actuales y datos de complementos relacionados, simplemente puede hacer:

print_r(get_site_transient('update_plugins'));

Pero, esto no tendrá información sobre un complemento recién instalado por otras 12 horas, tendría que hacer algo diferente para ellos, por ejemplo. utilizar una versión modificada del código de wp_update_pluginsen wp-includes/update.php...

Después de hacer esto para probarlo, parece confirmar que, independientemente del nombre de archivo o ubicación del complemento o en mayúscula, en realidad es el Plugin Nameque genera el slug de actualización, muy probablemente a través de sanitize_title. Entonces creo que la respuesta correcta debería ser:

// 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']);
majick
fuente
+1 y una nota adicional es que esto también podría cambiar con el tiempo, ya que el equipo de wordpress.org lo hizo explícito, que la metodología de cálculo de babosas aún no es totalmente definitiva
Mark Kaplun
No estoy seguro de que esto sea exacto, estaba intentando hacerlo para un complemento, pero esto falla: el nombre del complemento que se devuelve es "Responsive WordPress Slider - Soliloquy Lite" y la babosa es: soliloquy-lite
Chris
Sospecho que esto se debe a que el slug se genera en el momento en que el complemento se envía al repositorio y no cambia con el nombre más adelante ... en la mayoría de los casos, coincide con el nombre del directorio, pero si hay excepciones para ambos, podría ser uno u otro no es ideal: - /
majick
0

Puede obtener el nombre de la carpeta del complemento (PHP5.3 +) pasando DIR a plugin_basename (), así:

$plugin_foldername = plugin_basename( __DIR__ );
jb510
fuente
0

Prueba esto:

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;
}
ocupado
fuente
1
Por favor, editar su respuesta y añade una explicación de lo que hace este código.
Nathan Johnson
0

Para la mayoría de los complementos, el "slug" será el mismo que el nombre del directorio. Aunque las personas .org pueden establecer el nombre del directorio a lo que quieran.

$slug = (dirname(plugin_basename(__FILE__)));
John Dee
fuente