Kişisel API'den eklentiyi güncelleme


9

Şu anda Wordpress eklenti deposunda istemediğim bir wordpress eklentisi geliştiriyorum. Ancak yine de kendi API havuzumdan müşterilerime güncellemeler gönderebilmek istiyorum.

Ben bu konuda biraz okudum ve hakkında bir şey gibi görünüyor bir şey pre_set_site_transient_update_pluginsfiltre, ancak bu konuda fazla bilgi bulamıyorum. Ben çalışamadım bu öğretici ( http://konstruktors.com/blog/wordpress/2538-automatic-updates-for-plugins-and-themes-hosted-outside-wordpress-extend/ ) denedim . Yorumlardan, diğerlerinin aslında WP'nin şu anki sürümü olması gereken ile çalışabileceğini söyleyebilirim (en son yanıt 22 Nis).

Eklentiyi siteden yüklemeyi ve API klasörünü ikinci bir alana koymayı denedim, ancak genellikle bir güncelleme olduğunda aldığım güncelleme bildirimi hiçbir yerde gösterilmedi.

Özel eklentilerin otomatik güncellemeyi diğer depolardan çalıştırmanın gerçekten mümkün olup olmadığından emin değilim, bu yüzden burada herhangi birinin bu şeylerle ilgili herhangi bir deneyimi olup olmadığını duymak isterim? Öğreticideki çözüm kolay bir çözüm gibi görünüyordu - daha gelişmiş bir şekilde yapmanın bir şekilde mümkün olup olmadığını merak ediyorum?

Kendi otomatik çalışmamdan bu otomatik güncellemeyi almak için herhangi bir yardım çok takdir edilecektir!

(PS: WP sürüm 3.1.3 kullanıyorum)


Partiye geç kalabilirim, ancak tam olarak bunun için oluşturduğum bir eklenti bulabilirsiniz: WP Plugin Update Server
froger.me

Yanıtlar:



2

Evet, bu mümkün. Profesyonel WordPress Eklenti Geliştirme'de buna adanmış bir bölüm var . Henüz yapmadıysanız, bir kopyasını alın. Kesinlikle yardımcı olacaktır.


Aslında bunun bir PDF sürümünü çevrimiçi buldum, ama bu da benim için işe yaramadı.
Simon

Eğer bunun doğru, bunu yapmış HTTP API bakmak yapmak eğer çalışır, codex.wordpress.org/HTTP_API
Wyck

Yeniden başladım. Şimdiye kadar ne var eklenti güncelleme kontrol kullanarak kanca add_filter("pre_set_site_transient_update_plugins","dne_altapi_check"); dne_altapi_check içeren print_r("hi");- ancak güncellemeler altında "Tekrar kontrol et" düğmesine bastığınızda, hiç bir şey yazdırmıyor .. Am I Güncelleme denetleyicisine takılırken yanlış bir şey mi yapıyorsunuz?
Simon

Birisi eklenti güncelleme personeli için sınıf yazdı hatırlıyorum, ama bu yazı için bağlantı bulabilirsiniz: /
Mamaduka

1

WooCommerce için, bu eklenti veya tema wordpress.org'da barındırılmadığında özellikle çalışan bu ticari Eklenti ve Tema Güncelleme API yöneticisi var. Kendinden barındırılan eklentiler ve temalar için güncellemeler sağlamak üzere tasarlanmıştır. Eklenti, kendiniz yazmak istemeyen ve çok sayıda özelliğe, ayrıca satılan eklentiler ve temalar için çalışma örneklerine ihtiyaç duyanlar içindir.

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


1

Ayrıca http://wp-updates.com/ adresinde düzenli bir hizmet var - ücretsiz bir tema veya eklenti elde edersiniz. FYI - bu benim sitem değil ama bir süre önce denedim ve oldukça iyi görünüyordu.


Güzel bir hizmet gibi görünüyor, ancak web kontrol panelinde veya iletişimde (neredeyse ücretsiz planda) HTTPS'yi fark etmedim: ayrıca güncelleme kontrolü yaparken herhangi bir mülkiyet kontrolü bulamadım (bana çok sade görünüyor) POST isteği), eklentinin adını bilerek ve bazı tahminlerde bulunarak işlerin çalınabileceğini hissediyorum. Güvenlik tarafında biraz daha profesyonel görünüyordu, ben kullanmak isterdim.
reallynice

1

Tek bir site yüklemesi için (çoklu sitede test etmedim), github veya gitlab gibi harici bir hizmetten güncellemeniz gereken sadece iki kanca var. Aşağıdaki kodda, ben şu anda kodumu barındırmak için kullandığım beri gitlab kullanın. Muhtemelen gitlab parçalarını soyutlamalıyım ...

Kullanmanız gereken ilk kanca pre_set_site_transient_update_themes. Bu, WordPress'in site_transient değerini kullanılabilir güncellemeler olup olmadığını göstermek için ayarlamak için kullandığı filtredir. Uzak sürümünüze bağlanmak ve mevcut güncelleme olup olmadığını görmek için bu kancayı kullanın. Varsa, geçici olanı WordPress'in güncellemeler olduğunu bilmesi ve kullanıcıya bildirimi göstermesi için değiştirin.

Kullanmanız gereken diğer kanca upgrader_source_selection. Yine de gitlab için bu filtre gereklidir, çünkü indirilen klasörün adı tema ile aynı değildir, bu nedenle bu kancayı doğru adla yeniden adlandırmak için kullanırız. Uzak deponuz doğru adda bir zip sağlıyorsa, bu kancaya bile ihtiyacınız yoktur.

Kullanabileceğiniz üçüncü, isteğe bağlı kanca auto_update_theme, temanızı otomatik olarak güncellemek istiyorsanız. Aşağıdaki örnekte, bu kancayı yalnızca bu temayı otomatik olarak güncellemek için kullanıyorum.

Bu kod yalnızca WordPress 4.9.x ile test edilmiştir. PHP> 7.0 gerektirir.

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 );
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.