개인 API에서 플러그인 업데이트


9

Wordpress 플러그인 저장소에서 원하지 않는 순간에 WordPress 플러그인을 개발 중입니다. 그러나 여전히 내 API 저장소에서 costumers로 업데이트를 푸시하고 싶습니다.

나는 이것에 대해 꽤 많이 읽었으며, 무언가에 관한 것으로 보이는 것은 pre_set_site_transient_update_plugins필터이지만, 이것에 관한 많은 정보를 찾을 수는 없습니다. 나는이 자습서 ( http://konstruktors.com/blog/wordpress/2538-automatic-updates-for-plugins-and-themes-hosted-outside-wordpress-extend/ )를 시도했지만 작동하지 못했습니다. 의견을 통해 다른 사람들이 실제로 최신 버전의 WP (최신 응답 4 월 22 일)와 관련 하여이 작업을 실제로 수행 할 수 있다고 말할 수 있습니다.

사이트에서 플러그인을 설치하고 API 폴더를 두 번째 도메인에 배치하려고 시도했지만 일반적으로 업데이트를 사용할 수있을 때 나타나는 업데이트 알림은 어디에도 표시되지 않았습니다.

실제로 사용자 정의 플러그인이 다른 리포지토리에서 자동 업데이트를 실행하도록 할 수 있는지 확실하지 않으므로 여기에있는 사람 이이 물건에 대해 전혀 경험이 없다면 듣고 싶습니다. 튜토리얼의 솔루션은 쉬운 솔루션 인 것처럼 보였습니다. 어떻게보다 고급 방식으로 수행 할 수 있는지 궁금합니다.

내 저장소 작업 에서이 자동 업데이트를 얻는 데 도움이 될 것입니다.

(PS : WP 버전 3.1.3을 실행하고 있습니다)


나는 파티에 늦을지도 모르지만, 당신은 내가 정확히 그것을 위해 만든 플러그인을 찾을 수 있습니다 : WP 플러그인 업데이트 서버
froger.me

답변:



2

예, 가능합니다. 에서 전체 장있어 전문 워드 프레스 플러그인 개발 이 전용은. 아직 구입하지 않은 경우 사본을 선택하십시오. 확실히 도움이 될 것입니다.


실제로이 온라인의 PDF 버전을 찾았지만 나에게도 효과가없는 것 같습니다.
Simon

당신이 그것을 바로 내가 일을 한 HTTP의 API에서보기를 할 경우이 작업을 수행, codex.wordpress.org/HTTP_API
Wyck

방금 다시 시작했습니다. 내가 지금까지 가지고있는 것은 플러그인 업데이트 확인에 연결하는 것입니다. add_filter("pre_set_site_transient_update_plugins","dne_altapi_check"); 그 후에 dne_altapi_check 기능이 있습니다 print_r("hi");-그러나 업데이트에서 "다시 확인"버튼을 누르면 아무것도 인쇄되지 않습니다. 업데이트 검사기에 연결할 때 문제가 있습니까?
Simon

나는 누군가 플러그인 업데이트 직원을 위해 수업을 썼다는 것을 기억하지만 그 게시물에 대한 링크를 찾을 수 있습니다 : /
Mamaduka

1

WooCommerce 용 상용 플러그인 및 테마 업데이트 API 관리자가 있는데, 이는 플러그인 또는 테마가 wordpress.org에서 호스팅되지 않는 경우 특히 작동합니다. 자체 호스팅 플러그인 및 테마에 대한 업데이트를 제공하도록 설계되었습니다. 플러그인은 직접 작성하고 싶지 않고 많은 기능과 함께 판매되는 플러그인 및 테마에 대한 실제 예제가 필요한 사람들을위한 것입니다.

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


1

http://wp-updates.com/ 에는 깔끔한 서비스가 있습니다. 하나의 테마 또는 플러그인이 무료로 제공됩니다. 참고로-이것은 내 사이트가 아니지만 얼마 전에 시도했지만 꽤 좋았습니다.


좋은 서비스 인 것 같지만 웹 제어판이나 통신에서 HTTPS를 거의 알지 못했습니다 (더 많은 무료 계획). 업데이트 확인을 할 때 어떤 종류의 소유권 확인도 찾지 못했습니다 (매우 평범한 것처럼 보입니다) POST 요청), 플러그인 이름을 알고 추측 할 수있는 물건을 훔칠 수 있다고 생각합니다. 보안 측면에서 좀 더 전문적인 것처럼 보이면 사용하고 싶었습니다.
reallynice

1

단일 사이트 설치 (다중 사이트에서 테스트하지는 않음)의 경우 github 또는 gitlab과 같은 외부 서비스에서 업데이트해야하는 후크는 두 개뿐입니다. 아래 코드에서 gitlab을 사용하므로 코드를 호스팅하는 데 사용됩니다. 아마도 gitlab 부분을 추상화해야합니다 ...

가장 먼저 사용해야 할 것은 pre_set_site_transient_update_themes입니다. 사용 가능한 업데이트가 있는지 표시하기 위해 WordPress에서 site_transient를 설정하는 데 사용하는 필터입니다. 이 후크를 사용하여 원격 버전에 연결하고 사용 가능한 업데이트가 있는지 확인하십시오. 있는 경우 WordPress에 업데이트가 있음을 알리고 사용자에게 알림을 표시 할 수 있도록 임시 항목을 수정하십시오.

사용해야 할 다른 후크는 upgrader_source_selection입니다. 다운로드 한 폴더의 이름이 테마와 다르기 때문에 gitlab에이 필터가 필요하므로이 후크를 사용하여 이름을 올바른 이름으로 바꿉니다. 원격 저장소가 올바른 이름의 zip을 제공하는 경우이 후크가 필요하지 않습니다.

세 번째 옵션 인 후크는 auto_update_theme테마를 자동 업데이트하려는 경우입니다. 아래 예에서이 후크를 사용하여이 특정 테마 만 자동 업데이트합니다.

이 코드는 WordPress 4.9.x에서만 테스트되었습니다. PHP> 7.0이 필요합니다.

functions.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 );
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.