Cập nhật plugin từ API cá nhân


9

Tôi đang phát triển một plugin wordpress tại thời điểm mà tôi không muốn trong kho lưu trữ plugin Wordpress. Tuy nhiên tôi vẫn muốn có thể đẩy các bản cập nhật cho người tiêu dùng của mình từ kho lưu trữ API của riêng tôi.

Tôi đã đọc khá nhiều về điều này, và một điều có vẻ như là một pre_set_site_transient_update_pluginsbộ lọc, tuy nhiên tôi không thể tìm thấy nhiều thông tin về điều này. Tôi đã thử hướng dẫn này ( http://konstruktor.com/blog/wordpress/2538-automatic-updates-for-plugins-and-theme-hosted-outside-wordpress-extend/ ) mà tôi không thể làm việc. Tôi có thể nói từ các ý kiến ​​rằng những người khác thực sự có thể làm cho điều này hoạt động với phiên bản gần như là phiên bản hiện tại của WP (phản hồi mới nhất ngày 22 tháng 4).

Tôi đã thử cài đặt plugin từ trang web và đặt thư mục API vào tên miền thứ hai, nhưng thông báo cập nhật tôi thường nhận được khi có bản cập nhật, không hiển thị ở bất cứ đâu.

Tôi không chắc liệu các plugin tùy chỉnh có thể chạy cập nhật tự động từ các kho lưu trữ khác hay không, vì vậy tôi muốn biết liệu có ai ở đây có bất kỳ kinh nghiệm nào với công cụ này không? Giải pháp trong hướng dẫn dường như là một giải pháp dễ dàng - tôi tự hỏi liệu bằng cách nào đó có thể thực hiện nó theo cách nâng cao hơn không?

Bất kỳ trợ giúp nào nhận được cập nhật tự động này từ kho lưu trữ của riêng tôi làm việc sẽ được đánh giá cao!

(PS: Tôi đang chạy phiên bản WP 3.1.3)


Tôi có thể đến bữa tiệc muộn, nhưng bạn có thể tìm thấy một plugin tôi đã xây dựng chính xác cho điều đó: WP Server Update Server
froger.me

Câu trả lời:



2

Vâng, điều này là có thể. Có cả một chương trong Phát triển Plugin WordPress chuyên nghiệp dành riêng cho việc này. Nếu bạn chưa có, hãy lấy một bản sao. Nó chắc chắn sẽ giúp.


Tôi thực sự đã tìm thấy một phiên bản PDF của trực tuyến này, nhưng dường như nó cũng không hoạt động với tôi.
Simon

Nó hoạt động nếu bạn làm đúng, tôi đã làm được, hãy xem API HTTP, codex.wordpress.org/HTTP_API
Wyck

Tôi chỉ bắt đầu lại. Những gì tôi có cho đến nay là nối vào kiểm tra cập nhật plugin bằng cách sử dụng add_filter("pre_set_site_transient_update_plugins","dne_altapi_check"); Sau đó tôi có chức năng dne_altapi_check có chứa print_r("hi");- tuy nhiên khi tôi nhấn nút "Kiểm tra lại" trong các bản cập nhật, tôi không in gì cả .. Tôi có làm gì sai khi nối vào trình kiểm tra cập nhật?
Simon

Tôi nhớ ai đó đã viết lớp cho nhân viên cập nhật plugin, nhưng có thể tìm thấy liên kết cho bài đăng đó: /
Mamaduka

1

Có trình quản lý API cập nhật chủ đề và plugin thương mại cho WooC Commerce đặc biệt hoạt động nếu plugin hoặc chủ đề không được lưu trữ trên wordpress.org. Nó được thiết kế để cung cấp các bản cập nhật cho các plugin và chủ đề tự lưu trữ. Plugin dành cho những người không muốn tự viết và cần rất nhiều tính năng, cộng với các ví dụ hoạt động cho các plugin và chủ đề đang được bán.

http://www.toddlahman.com/shop/wordpress-automatic-update-api-manager/


1

Ngoài ra còn có một dịch vụ gọn gàng tại http://wp-updates.com/ - bạn nhận được một chủ đề hoặc plugin miễn phí. FYI - đây không phải là trang web của tôi nhưng tôi đã thử nó cách đây một thời gian và nó có vẻ khá tốt.


Có vẻ là một dịch vụ tốt, nhưng tôi đã không nhận thấy (hầu như trên gói miễn phí) HTTPS trong bảng điều khiển web cũng như trong giao tiếp: hơn nữa tôi không tìm thấy bất kỳ loại kiểm tra quyền sở hữu nào khi thực hiện kiểm tra cập nhật (có vẻ như tôi rất đơn giản POST yêu cầu), tôi cảm thấy những thứ đó có thể bị đánh cắp, biết tên plugin và đưa ra một số dự đoán. Tôi rất thích sử dụng nó, nếu nó có vẻ chuyên nghiệp hơn một chút về mặt bảo mật.
thật sự là

1

Đối với cài đặt một trang web (tôi chưa thử nghiệm nó trên nhiều trang web), chỉ có hai móc bạn cần cập nhật từ một dịch vụ bên ngoài như github hoặc gitlab. Trong mã bên dưới, tôi sử dụng gitlab vì đó là những gì tôi sử dụng để lưu trữ mã của mình ngay bây giờ. Tôi có lẽ nên trừu tượng hóa các phần gitlab ...

Móc đầu tiên bạn sẽ cần sử dụng là pre_set_site_transient_update_themes. Đây là bộ lọc mà WordPress sử dụng để đặt site_transient hiển thị nếu có bản cập nhật. Sử dụng móc này để kết nối với phiên bản từ xa của bạn và xem nếu có bản cập nhật. Nếu có, sau đó sửa đổi tạm thời để WordPress biết có bản cập nhật và có thể hiển thị thông báo cho người dùng.

Các hook khác bạn sẽ cần sử dụng là upgrader_source_selection. Bộ lọc này là cần thiết, đối với gitlab, vì tên của thư mục đã tải xuống không giống với chủ đề, vì vậy chúng tôi sử dụng móc này để đổi tên thành tên chính xác. Nếu kho lưu trữ từ xa của bạn cung cấp một mã zip với tên chính xác, thì bạn thậm chí không cần móc này.

Thứ ba, tùy chọn, hook bạn có thể sử dụng là auto_update_themenếu bạn muốn tự động cập nhật chủ đề của mình. Trong ví dụ dưới đây, tôi sử dụng hook này để tự động cập nhật chủ đề cụ thể này.

Mã này chỉ được thử nghiệm với WordPress 4.9.x. Nó đòi hỏi PHP> 7.0.

Hàm.php

//* Load the updater.
require PATH_TO . 'updater.php';
$updater = new updater();
\add_action( 'init', [ $updater, 'init' ] );

updater.php

/**
 * @package StackExchange\WordPress
 */
declare( strict_types = 1 );
namespace StackExchange\WordPress;

/**
 * Class for updating the theme.
 */
class updater {

  /**
   * @var Theme slug.
   */
  protected $theme = 'theme';

  /**
   * @var Theme repository name.
   */
  protected $repository = 'project/theme';

  /**
   * @var Repository domain.
   */
  protected $domain = 'https://gitlab.com/';

  /**
   * @var CSS endpoint for repository.
   */
  protected $css_endpoint = '/raw/master/style.css';

  /**
   * @var ZIP endpoint for repository.
   */
  protected $zip_endpoint = '/repository/archive.zip';

  /**
   * @var Remote CSS URI.
   */
  protected $remote_css_uri;

  /**
   * @var Remote ZIP URI.
   */
  protected $remote_zip_uri;

  /**
   * @var Remote version.
   */
  protected $remote_version;

  /**
   * @var Local version.
   */
  protected $local_version;

  /**
   * Method called from the init hook to initiate the updater
   */
  public function init() {
    \add_filter( 'auto_update_theme', [ $this, 'auto_update_theme' ], 20, 2 );
    \add_filter( 'upgrader_source_selection', [ $this, 'upgrader_source_selection' ], 10, 4 );
    \add_filter( 'pre_set_site_transient_update_themes', [ $this, 'pre_set_site_transient_update_themes' ] );
  }

  /**
   * Method called from the auto_update_theme hook.
   * Only auto update this theme.
   * This hook and method are only needed if you want to auto update the theme.
   *
   * @return bool Whether to update the theme.
   */
  public function auto_update_theme( bool $update, \stdClass $item ) : bool {
    return $this->theme === $item->theme;
  }

  /**
   * Rename the unzipped folder to be the same as the existing folder
   *
   * @param string       $source        File source location
   * @param string       $remote_source Remote file source location
   * @param \WP_Upgrader $upgrader      \WP_Upgrader instance
   * @param array        $hook_extra    Extra arguments passed to hooked filters
   *
   * @return string | \WP_Error The updated source location or a \WP_Error object on failure
   */
  public function upgrader_source_selection( string $source, string $remote_source, \WP_Upgrader $upgrader, array $hook_extra ) {
    global $wp_filesystem;

    $update = [ 'update-selected', 'update-selected-themes', 'upgrade-theme' ];

    if( ! isset( $_GET[ 'action' ] ) || ! in_array( $_GET[ 'action' ], $update, true ) ) {
      return $source;
    }

    if( ! isset( $source, $remote_source ) ) {
      return $source;
    }

    if( false === stristr( basename( $source ), $this->theme ) ) {
      return $source;
    }

    $basename = basename( $source );
    $upgrader->skin->feedback( esc_html_e( 'Renaming theme directory.', 'bootstrap' ) );
    $corrected_source = str_replace( $basename, $this->theme, $source );

    if( $wp_filesystem->move( $source, $corrected_source, true ) ) {
      $upgrader->skin->feedback( esc_html_e( 'Rename successful.', 'bootstrap' ) );
      return $corrected_source;
    }

    return new \WP_Error();
  }

  /**
   * Add respoinse to update transient if theme has an update.
   *
   * @param $transient
   *
   * @return
   */
  public function pre_set_site_transient_update_themes( $transient ) {
    require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
    $this->local_version = ( \wp_get_theme( $this->theme ) )->get( 'Version' );

    if( $this->hasUpdate() ) {
      $response = [
        'theme'       => $this->theme,
        'new_version' => $this->remote_version,
        'url'         => $this->construct_repository_uri(),
        'package'     => $this->construct_remote_zip_uri(),
        'branch'      => 'master',
      ];
      $transient->response[ $this->theme ] = $response;
    }

    return $transient;
  }

  /**
   * Construct and return the URI to the remote stylesheet
   *
   * @return string The remote stylesheet URI
   */
  protected function construct_remote_stylesheet_uri() : string {
    return $this->remote_css_uri = $this->domain . $this->repository . $this->css_endpoint;
  }

  /**
   * Construct and return the URI to the remote ZIP file
   *
   * @return string The remote ZIP URI
   */
  protected function construct_remote_zip_uri() : string {
    return $this->remote_zip_uri = $this->domain . $this->repository . $this->zip_endpoint;
  }

  /**
   * Construct and return the URI to remote repository
   *
   * @access protected
   * @since  1.0
   *
   * @return string The remote repository URI
   */
  protected function construct_repository_uri() : string {
    return $this->repository_uri = $this->domain . \trailingslashit( $this->repository );
  }

  /**
   * Get and return the remote version
   *
   * @return string The remote version
   */
  protected function get_remote_version() : string {
    $this->remote_stylesheet_uri = $this->construct_remote_stylesheet_uri();
    $response = $this->remote_get( $this->remote_stylesheet_uri );
    $response = str_replace( "\r", "\n", \wp_remote_retrieve_body( $response ) );
    $headers = [ 'Version' => 'Version' ];

    foreach( $headers as $field => $regex ) {
      if( preg_match( '/^[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $response, $match ) && $match[1] ) {
        $headers[ $field ] = _cleanup_header_comment( $match[1] );
      }
      else {
        $headers[ $field ] = '';
      }
    }

    return $this->remote_version = ( '' === $headers[ 'Version' ] ) ? '' : $headers[ 'Version' ];
  }

  /**
   * Return whether the theme has an update
   *
   * @return bool Whether the theme has an update
   */
  protected function hasUpdate() : bool {
    if( ! $this->remote_version ) $this->remote_version = $this->get_remote_version();
    return version_compare( $this->remote_version, $this->local_version, '>' );
  }

  /**
   * Wrapper for \wp_remote_get()
   *
   * @param string $url  The URL to get
   * @param array  $args Array or arguments to pass through to \wp_remote_get()
   *
   * @return array|WP_Error Return the request or an error object
   */
  protected function remote_get( string $url, array $args = [] ) {
    return \wp_remote_get( $url, $args );
  }
}
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.