Bagaimana saya bisa menemukan siput plugin?

11

Saya bertanya-tanya bagaimana saya bisa menemukan siput plugin (siput = nama internal yang digunakan oleh WordPress untuk melakukan pembaruan plugin dan untuk menentukan plugin mana yang sedang aktif)? Biasanya nama folder plugin tetapi jika plugin tidak memiliki folder, itu adalah nama file-nya (seperti hello.php). Apakah ada pengecualian lain?

  1. Apakah huruf kecil dan huruf besar penting?
  2. Bisakah plugin memiliki siput yang berbeda dari nama foldernya? Bagaimana jika ada plugin bernama hello.php dan /hello.php/hello.php?
Paul
sumber
Pertanyaan yang sangat bagus, Sayang sekali bahwa kita tidak dapat memberikan hadiah kepada Q's, tapi saya kira A adalah penghargaan;)
brasofilo

Jawaban:

8

String yang digunakan di WordPress untuk mengidentifikasi plugin adalah:

plugin_basename($file);

... di mana $fileadalah file dengan header Plugin .

Jadi jika Anda berada di plugin Anda, dapatkan siput dengan:

$slug = plugin_basename( __FILE__ );
fuxia
sumber
1
plugin_basename ($ file); Bukan siput sejak 3.8.1. Ini adalah jalur folder / plugin_main_file.php. Sebagai "siput" dari plugin Akismet bukan "akismet / akismet.php" tetapi "akismet".
Jeff Mattson
3
ini bukan lagi jawaban yang benar dalam kedua kasus.
Majick
@majick benar, untuk Wordpress 4.7.4 itu bukan jawaban
Marecky
2
Cara lain untuk menghasilkan plugin slug adalah dengan menggunakan dirname(plugin_basename(__FILE__)).
ilanco
2

Jika Anda menginstal WP-CLI maka Anda bisa mendapatkan daftar plugin dengan slug dan versinya dari baris perintah:

> wp plugin list

Saya tahu itu mungkin bukan yang Anda inginkan, jika Anda perlu menemukan kode siput, tetapi telah membantu saya saat bekerja dengan plugin TGM-Plugin-Activation.

Saya merasa sulit untuk bekerja dengan WordPress tanpa WP-CLI, secara umum ini adalah alat yang sangat berguna untuk banyak tugas umum yang terkait dengan WordPress.

Thomas Bindzus
sumber
2

Perbedaan antara file plugin (utama) dan slug plugin adalah tempat di mana WordPress Codex dapat melakukan jauh lebih baik. Saya mengerti kebingungan Anda seperti yang saya rasakan baru-baru ini (dicampur dengan frustrasi).

Inilah yang saya pelajari dengan melakukan beberapa "pekerjaan detektif" pada kode inti WordPress.

File plugin

Ini adalah cara unik WordPress mengidentifikasi dan merekam sebuah plugin. Itu terdiri dari direktori plugin DAN file plugin utama (yang dengan header file yang berisi berbagai detail plugin seperti versi, penulis, dll.).

Akan terlihat seperti ini: your-plugin-directory/main-file.php

Jika Anda melihat data plugin aktif (dikembalikan oleh get_option( 'active_plugins' )), Anda akan melihat bahwa WordPress hanya membutuhkan file plugin ini untuk mengidentifikasi plugin dengan benar.

Anda dapat memilih untuk menganggapnya sebagai jalur relatif file utama plugin Anda (relatif terhadap wp-content/plugins/direktori yang ada). Anda dapat "membuat" jalur absolut dari file plugin utama dengan sesuatu seperti ini:trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

Inti itu sendiri menghasilkan file plugin seperti ini:

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

Plugin siput

Orang akan mengharapkan plugin "slug" menjadi semacam ID standar untuk plugin seperti post slug adalah untuk posting - jadi Anda bisa menggunakan "slug" ini untuk menyediakannya ke fungsi inti WordPress dan menyelesaikannya.

Tidak juga. Setelah mencari inti untuk referensi ke siput plugin (atau tema untuk masalah apa) dan menemukan hampir tidak ada, saya pikir saya memiliki pemahaman tentang itu.

Satu-satunya siput nyata adalah untuk hal-hal yang dapat diakses melalui URL unik: posting, halaman, taksonomi, dll. Itulah inti dari mengambil nama sesuatu (seperti judul posting) dan menghasilkan versi yang ramah URL untuk itu: menggunakan itu dalam URL.

Tapi di mana kita menggunakan tema / plugin "siput" di URL?

Kami tidak melakukan itu pada instalasi WordPress individu - baik di admin WP atau frontend.

Namun, ada tempat yang sangat terjerat dengan kode WordPress, situs WordPress.org. Orang-orang mengalami kesulitan membedakan antara keduanya, termasuk bahwa itu entah bagaimana umum di antara pengembang untuk mempertimbangkan tema WordPress.org atau siput plugin harus bekerja sama dengan siput posting atau halaman.

Mereka melayani tujuan yang sama tetapi di situs web yang berbeda . Pada WordPress.org mereka digunakan untuk secara unik mengidentifikasi tema dari orang lain, dan plugin dari yang lain (di URL seperti https://wordpress.org/plugins/akismet/).

Tetapi ketika datang ke instalasi WordPress individu , keunikan yang sama tidak dapat dijamin karena tidak ada otoritas untuk menegakkannya (seperti pada WordPress.org). Ini bisa bekerja jika semua plugin dan tema berasal dari WordPress.org, tapi untungnya bukan itu masalahnya.

Apa yang dilakukan kode WordPress dengan siput tema / plugin?

Kode inti WordPress tidak bergantung pada siput tema / plugin untuk melakukan hal-hal seperti menginstal, mengaktifkan, memperbarui, menghapus tema, atau plugin.

Untuk tema, ini bergantung pada direktori tema karena titik masuk utama ke dalam suatu tema adalah style.cssfile (Anda tidak dapat menggunakan file CSS lain untuk menahan tajuk rincian tema Anda).

Untuk plugin, ia bergantung pada direktori plugin DAN file plugin utama , karena plugin dapat memanggil file utama mereka sesuka mereka.

Satu-satunya hal yang inti gunakan untuk tema / plugin adalah ketika menangani tema dan plugin dari direktori WordPress.org: mengambil daftar plugin, memeriksa pembaruan, melaporkan kembali ke data penggunaan direktori, dan sebagainya.


Untuk menyelesaikan masalah tentang siput plugin: setiap kali Anda menemukan data plugin dengan slugentri, 99% dari waktu itu akan merujuk ke siput plugin WordPress.org.

Bagaimana cara mengidentifikasi plugin?

Jika Anda ingin secara terprogram mengaktifkan, memperbarui, menonaktifkan atau menghapus plugin tertentu pada instalasi WordPress, Anda perlu menggunakan file plugin. Anda bisa mendapatkannya seperti ini dari file utama plugin Anda:

$plugin_file = plugin_basename( __FILE__ );

Jika Anda ingin menargetkan plugin tertentu dari plugin lain, hal-hal menjadi sedikit rumit karena Anda perlu mengandalkan sedikit "tebakan".

Anda bisa membuat kode nama plugin, mencari plugin di daftar semua plugin (lihat get_plugins () ) dan dapatkan file plugin dari sana.

Jika Anda tahu kelas atau fungsi yang ditentukan oleh plugin itu, Anda bisa menggunakan refleksi (lihat jawaban ini untuk kelas dan yang ini untuk fungsi).


Saya harap ini membantu Anda dan orang lain yang mungkin kesulitan berurusan dengan "plugin slug". Itu bisa menyelamatkan saya beberapa jam :)

Vlad Olaru
sumber
0

Hanya mengklarifikasi sejak posting asli.

Cara saya menemukan plugin slug adalah dengan pertama-tama menavigasi ke folder plugin Anda kemudian membuka folder yang terkait dengan plugin, dan akhirnya menemukan file yang menampung kode di bawah ini. Setelah Anda menemukan file ini, nama file minus ekstensi harus menjadi plugin slug Anda.

Sebagai contoh jika saya menemukan kode di bawah ini dalam file bernama advanced-plugin-awesomeness.php siput saya akan maju-plugin-kedahsyatan.

Semoga ini membantu!

/*
Plugin Name: Name of plugin here
Version: 2.4.6
Description: plugin description here
Author: plugin author here
Meatloaf4
sumber
-1 sementara sebagian besar nama file dan direktori cocok, ini bukan metode yang dapat diandalkan karena pembaruan slug sebenarnya adalah direktori - bukan nama file (kecuali tidak ada direktori.)
majick
atau bahkan direktori! lihat jawaban saya yang diperbarui, sebenarnya berasal dari Nama Plugin.
Majick
0

Sayangnya siput dikembalikan melalui API Pembaruan, jawaban untuk pertanyaan ini tidak begitu jelas kecuali jika Anda menanyakan API itu sendiri. Namun, jika Anda ingin melihat daftar siput plugin Anda saat ini dan data plugin terkait, Anda cukup melakukannya:

print_r(get_site_transient('update_plugins'));

Tapi, ini tidak akan memiliki info tentang plugin yang baru diinstal selama 12 jam, Anda harus melakukan sesuatu yang berbeda untuk mereka, misalnya. gunakan versi kode yang dimodifikasi dari wp_update_pluginsdalam wp-includes/update.php...

Setelah melakukan ini untuk mengujinya, tampaknya mengkonfirmasi bahwa, terlepas dari nama file plugin atau lokasi atau huruf besar, sebenarnya Plugin Nameyang menghasilkan pembaruan slug, kemungkinan besar melalui sanitize_title. Jadi saya percaya jawaban yang benar adalah:

// 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']);
majik
sumber
+1 dan catatan tambahan adalah bahwa ini mungkin juga berubah seiring waktu sebagaimana dibuat secara eksplisit oleh tim wordpress.org bahwa metodologi penghitungan siput belum sepenuhnya final
Mark Kaplun
Saya tidak yakin ini akurat, saya mencoba melakukannya untuk sebuah plugin tetapi ini gagal: nama plugin yang dikembalikan adalah "Slider WordPress Responsif - Soliloquy Lite" dan siputnya adalah: soliloquy-lite
Chris
Saya menduga ini karena siput dihasilkan pada saat plugin dikirimkan ke repositori dan tidak berubah dengan nama nanti ... dalam banyak kasus itu cocok dengan nama direktori, tetapi jika ada pengecualian untuk keduanya, itu bisa menjadi satu atau yang lain. itu tidak ideal: - /
majick
0

Anda bisa mendapatkan nama folder plugin (PHP5.3 +) dengan mengirimkan DIR ke plugin_basename (), seperti:

$plugin_foldername = plugin_basename( __DIR__ );
jb510
sumber
0

Coba ini:

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;
}
sibuk
sumber
1
Harap edit jawaban Anda dan tambahkan penjelasan tentang apa yang dilakukan kode ini.
Nathan Johnson
0

Untuk sebagian besar plugin, "slug" akan sama dengan nama direktori. Meskipun orang .org dapat mengatur nama direktori untuk apa pun yang mereka inginkan.

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