Làm thế nào tôi có thể tìm thấy sên của plugin?


11

Tôi đang tự hỏi làm thế nào tôi có thể tìm thấy slug của plugin (slug = tên nội bộ được WordPress sử dụng để thực hiện cập nhật plugin và để xác định plugin nào hiện đang hoạt động)? Nó thường là tên thư mục của plugin nhưng nếu plugin không có thư mục thì đó là tên tệp của nó (như hello.php). Có bất kỳ ngoại lệ khác?

  1. Các ký tự chữ thường và chữ hoa có vấn đề?
  2. Một plugin có thể có slug khác với tên thư mục của nó? Điều gì xảy ra nếu có một plugin có tên hello.php và /hello.php/hello.php khác?

Câu hỏi rất hay, đáng tiếc là chúng ta không thể trao tiền thưởng cho Q, nhưng tôi đoán A là giải thưởng;)
brasofilo

Câu trả lời:


8

Chuỗi được sử dụng trong WordPress để xác định plugin là:

plugin_basename($file);

Ở đâu $filelà một tập tin với các tiêu đề plugin .

Vì vậy, nếu bạn đang ở trong plugin của mình, hãy sử dụng slug với:

$slug = plugin_basename( __FILE__ );

1
plugin_basename (tập tin $); Không phải là sên kể từ 3.8.1. Đây là đường dẫn thư mục / plugin_main_file.php. Vì "sên" của plugin Akismet không phải là "akismet / akismet.php" mà là "akismet".
Jeff Mattson

3
đây không còn là câu trả lời đúng trong cả hai trường hợp
Majick 7/2/2016

@majick đúng, đối với Wordpress 4.7.4 thì đó không phải là câu trả lời
Marecky

2
Một cách khác để tạo slug plugin là sử dụng dirname(plugin_basename(__FILE__)).
ilanco

2

Nếu bạn cài đặt WP-CLI thì bạn có thể lấy danh sách các plugin bằng sên và phiên bản của chúng từ dòng lệnh:

> wp plugin list

Tôi biết đó có thể không phải là điều bạn muốn, nếu bạn cần tìm mã sên, nhưng nó đã giúp tôi trong khi làm việc với plugin TGM-Plugin-Activation.

Tôi thấy thật khó để làm việc với WordPress mà không có WP-CLI, nói chung nó là một công cụ rất hữu ích cho nhiều tác vụ phổ biến liên quan đến WordPress.


2

Sự khác biệt giữa tệp plugin (chính) và sên của plugin là nơi mà Codex WordPress có thể làm tốt hơn nhiều. Tôi hiểu sự nhầm lẫn của bạn vì tôi đã cảm thấy nó gần đây (trộn lẫn với sự thất vọng).

Đây là những gì tôi đã học được bằng cách thực hiện một số "công việc thám tử" trên mã lõi WordPress.

Các tập tin plugin

Đây là cách duy nhất WordPress xác định và ghi lại một plugin. Nó được tạo thành từ thư mục của plugin VÀ tệp plugin chính (tệp có tiêu đề tệp chứa các chi tiết plugin khác nhau như phiên bản, tác giả, v.v.).

Nó sẽ trông giống như thế này: your-plugin-directory/main-file.php

Nếu bạn nhìn vào dữ liệu bổ trợ đang hoạt động (được trả về get_option( 'active_plugins' )), bạn sẽ thấy rằng WordPress chỉ cần tệp plugin này để xác định đúng các plugin.

Bạn có thể chọn nghĩ về nó như là đường dẫn tương đối của tệp chính của plugin (liên quan đến wp-content/plugins/thư mục đó). Bạn có thể "soạn" đường dẫn tuyệt đối của tệp plugin chính với nội dung như sau:trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

Bản thân lõi tạo ra tệp plugin như thế này:

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

Sên plugin

Mọi người sẽ mong đợi plugin "slug" là một loại ID được tiêu chuẩn hóa cho plugin như slug post dành cho bài viết - vì vậy bạn có thể sử dụng "slug" này để cung cấp cho các chức năng cốt lõi của WordPress và khiến mọi thứ diễn ra.

Không hẳn vậy. Sau khi tìm kiếm cốt lõi để tham khảo các sên plugin (hoặc chủ đề cho những gì quan trọng) và tìm thấy hầu như không có gì, tôi nghĩ rằng tôi đã nắm bắt được nó.

Các sên thực sự duy nhất là những thứ dành cho những thứ có thể truy cập thông qua một URL duy nhất: bài đăng, trang, phân loại, v.v. Đó là toàn bộ việc lấy tên của một cái gì đó (như tiêu đề bài đăng) và tạo một phiên bản thân thiện với URL: để sử dụng nó trong một URL.

Nhưng chúng ta sử dụng chủ đề / plugin "sên" trong URL ở đâu?

Chúng tôi không làm điều đó trên các cài đặt WordPress riêng lẻ - không phải trong quản trị viên WP hoặc frontend.

Tuy nhiên, có một nơi rất vướng mắc với mã WordPress, trang web WordPress.org. Mọi người đang gặp khó khăn trong việc phân biệt giữa hai loại, bao gồm cả việc các nhà phát triển thường thấy các chủ đề WordPress.org hoặc sên plugin nên hoạt động giống như sên bài hoặc trang.

Họ phục vụ cùng một mục đích nhưng trên các trang web riêng biệt . Trên WordPress.org, chúng được sử dụng để xác định duy nhất một chủ đề từ những người khác và một plugin từ phần còn lại (trong các URL như https://wordpress.org/plugins/akismet/).

Nhưng khi nói đến các cài đặt WordPress riêng lẻ , tính duy nhất tương tự không thể được đảm bảo vì không có thẩm quyền để thực thi nó (như trên WordPress.org). Nó có thể hoạt động nếu tất cả các plugin và chủ đề đến từ WordPress.org, nhưng rất may đó không phải là trường hợp.

Mã WordPress làm gì với sên theme / plugin?

Mã lõi WordPress không dựa vào sên chủ đề / plugin để thực hiện những việc như cài đặt, kích hoạt, cập nhật, xóa chủ đề hoặc plugin.

Đối với chủ đề, nó phụ thuộc vào thư mục chủ đề vì điểm nhập chính vào chủ đề là style.csstệp (bạn không thể sử dụng tệp CSS khác để giữ tiêu đề chi tiết chủ đề của mình).

Đối với các plugin, nó phụ thuộc vào thư mục plugin VÀ tệp plugin chính , vì các plugin có thể gọi tệp chính của chúng theo cách chúng thích.

Điều duy nhất mà lõi sử dụng sên chủ đề / plugin là khi nó xử lý các chủ đề và plugin từ thư mục WordPress.org: tìm nạp danh sách các plugin, kiểm tra cập nhật, báo cáo lại dữ liệu sử dụng thư mục, v.v.


Để tóm tắt mọi thứ về sên plugin: bất cứ khi nào bạn tìm thấy dữ liệu plugin với slugmục nhập, 99% thời gian nó sẽ đề cập đến sên WordPress.org của plugin.

Làm thế nào để chúng ta đi về việc xác định các plugin?

Nếu bạn muốn lập trình kích hoạt, cập nhật, hủy kích hoạt hoặc xóa một plugin nhất định trên bản cài đặt WordPress, bạn cần sử dụng tệp plugin. Bạn có thể lấy nó như thế này từ tệp chính của plugin:

$plugin_file = plugin_basename( __FILE__ );

Nếu bạn muốn nhắm mục tiêu một plugin nhất định từ một plugin khác, mọi thứ trở nên phức tạp hơn một chút vì bạn cần phải dựa vào một chút "phỏng đoán".

Bạn có thể mã hóa tên plugin, tìm kiếm plugin trong danh sách tất cả các plugin (xem get_plugins () ) và lấy tệp plugin từ đó.

Nếu bạn biết một lớp hoặc hàm được xác định bởi plugin đó, bạn có thể sử dụng sự phản chiếu (xem câu trả lời này cho các lớp và cái này cho các hàm).


Tôi hy vọng điều này sẽ giúp bạn và những người khác có thể gặp khó khăn khi xử lý "sên plugin". Nó có thể giúp tôi tiết kiệm được một vài giờ :)


0

Chỉ cần làm rõ từ bài gốc.

Cách tôi đã tìm thấy slug plugin bằng cách trước tiên điều hướng đến thư mục plugin của bạn sau đó mở thư mục được liên kết với plugin và cuối cùng tìm thấy tệp chứa mã bên dưới. Khi bạn đã tìm thấy tệp này, tên tệp trừ phần mở rộng sẽ là sên plugin của bạn.

Ví dụ: nếu tôi tìm thấy đoạn mã dưới đây trong một tệp có tên advanced-plugin-awesomeness.php thì slug của tôi sẽ là advanced-plugin-awesomeness.

Hi vọng điêu nay co ich!

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

-1 vì trong khi hầu hết các tên tệp và thư mục khớp nhau, đây không phải là một phương pháp đáng tin cậy vì sên cập nhật thực sự là thư mục - không phải tên tệp (trừ khi không có thư mục.)
majick 7/2/2016

hoặc thậm chí không có thư mục! xem câu trả lời cập nhật của tôi, nó thực sự đến từ Tên Plugin.
Majick 7/2/2016

0

Thật không may, sên được trả về thông qua API cập nhật, câu trả lời cho câu hỏi này không quá rõ ràng trừ khi bạn truy vấn chính API. Tuy nhiên, nếu bạn muốn xem danh sách các sên plugin hiện tại và dữ liệu plugin liên quan, bạn chỉ cần làm:

print_r(get_site_transient('update_plugins'));

Nhưng, điều này sẽ không có thông tin về một plugin mới được cài đặt trong 12 giờ nữa, bạn sẽ phải làm một cái gì đó khác biệt cho những thứ đó, ví dụ. sử dụng phiên bản sửa đổi của mã từ wp_update_pluginstrong wp-includes/update.php...

Đã thực hiện điều này để kiểm tra nó, dường như xác nhận rằng, bất kể tên tệp hoặc vị trí hoặc chữ hoa của plugin, nó thực sự là Plugin Namethứ tạo ra sên cập nhật, rất có thể thông qua sanitize_title. Vì vậy, tôi tin rằng câu trả lời chính xác nên là:

// 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 và một lưu ý bổ sung là điều này cũng có thể thay đổi theo thời gian khi nhóm wordpress.org tuyên bố rõ ràng rằng phương pháp tính toán sên vẫn chưa hoàn toàn cuối cùng
Mark Kaplun

Tôi không chắc điều này là chính xác, tôi đã cố gắng làm điều đó cho một plugin nhưng điều này không thành công: tên plugin được trả về là "Responsive WordPress Slider - Soliloquy Lite" và slug là: soliloquy-lite
Chris

Tôi nghi ngờ điều này là do slug được tạo tại thời điểm plugin được gửi tới kho lưu trữ và không thay đổi với tên sau này ... trong hầu hết các trường hợp, nó không khớp với tên thư mục, nhưng nếu có ngoại lệ cho cả hai, thì nó có thể là cái này hay cái khác nó không lý tưởng: - /
majick

0

Bạn có thể lấy tên thư mục của plugin (PHP5.3 +) bằng cách chuyển DIR đến plugin_basename (), như vậy:

$plugin_foldername = plugin_basename( __DIR__ );

0

Thử đi:

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
Vui lòng chỉnh sửa câu trả lời của bạn và thêm một lời giải thích về những gì mã này làm.
Nathan Johnson

0

Đối với hầu hết các plugin, "slug" sẽ giống như tên thư mục. Mặc dù .org mọi người có thể đặt tên thư mục thành bất cứ thứ gì họ muốn.

$slug = (dirname(plugin_basename(__FILE__)));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.