Mise à jour du plugin à partir de l'API personnelle

9

Je suis en train de développer un plugin wordpress que je ne veux pas dans le référentiel de plugins Wordpress. Cependant, je souhaite toujours pouvoir transmettre les mises à jour à mes clients depuis mon propre référentiel d'API.

J'ai lu pas mal de choses à ce sujet, et le filtre pre_set_site_transient_update_plugins semble nous intéresser, mais je ne trouve pas beaucoup d’informations à ce sujet. J'ai essayé ce tutoriel ( enlace ) que je ne pouvais pas travailler. D'après les commentaires, je peux dire que d'autres personnes peuvent réellement obtenir cette solution avec ce qui doit être presque la version actuelle de WP (dernière réponse en date du 22 avril).

J'ai essayé d'installer le plug-in à partir du site et de placer le dossier de l'API sur un deuxième domaine, mais la notification de mise à jour que je reçois généralement lorsqu'une mise à jour est disponible ne s'affiche nulle part.

Je ne sais pas s'il est réellement possible de faire exécuter par la mise à jour automatique des plug-ins personnalisés à partir d'autres référentiels. J'aimerais donc savoir si quelqu'un ici a une quelconque expérience de ce type de matériel? La solution proposée dans le didacticiel semblait être une solution simple. Je me demande s’il est possible de le faire de manière plus avancée.

Toute aide pour que cette mise à jour automatique à partir de mon propre référentiel fonctionne serait très appréciée!

(PS: j'utilise la version 3.1.3 de WP)

    
posée Simon 29.05.2011 - 22:41

5 réponses

7

Pour le bénéfice des autres utilisateurs qui trouveront cette page, je suggère à ceux qui souhaitent fournir leurs propres mises à jour en dehors du référentiel officiel de WP, de consulter ce projet sur GitHub, qui en présente les fonctionnalités:

enlace

    
réponse donnée k3davis 17.08.2012 - 16:44
2

Oui, c'est possible. Un développement de plugins WordPress professionnels contient un chapitre entier consacré à cette question. Si vous ne l'avez pas déjà fait, prenez-en un exemplaire. Cela aidera certainement.

    
réponse donnée EAMann 29.05.2011 - 22:54
1

Il existe un gestionnaire commercial d’API de plugins et de thèmes pour WooCommerce qui fonctionne spécifiquement si le plugin ou le thème n’est pas hébergé sur wordpress.org. Il est conçu pour fournir des mises à jour pour les plugins et les thèmes auto-hébergés. Le plugin est destiné à ceux qui ne veulent pas l’écrire vous-même et qui a besoin de nombreuses fonctionnalités, ainsi que d’exemples pratiques pour les plugins et les thèmes vendus.

enlace

    
réponse donnée Todd Lahman 15.07.2013 - 10:25
1

Il existe également un service soigné sur enlace - vous obtenez un thème ou un plugin gratuitement. FYI - ce n’est pas mon site, mais je l’ai essayé il ya un moment et cela me semblait plutôt bon.

    
réponse donnée cwd 24.09.2013 - 05:53
1

Pour une installation sur un seul site (je ne l'ai pas testée sur plusieurs sites), vous ne devez mettre à jour que deux points d'ancrage à partir d'un service externe tel que github ou gitlab. Dans le code ci-dessous, j'utilise gitlab car c'est ce que j'utilise pour héberger mon code maintenant. Je devrais probablement faire abstraction des parties de Gitlab ...

Le premier hook que vous devrez utiliser est pre_set_site_transient_update_themes . Il s’agit du filtre utilisé par WordPress pour définir le site_transient de manière à indiquer s’il existe des mises à jour disponibles. Utilisez ce crochet pour vous connecter à votre version distante et voir si des mises à jour sont disponibles. Si tel est le cas, modifiez le transitoire afin que WordPress sache qu’il existe des mises à jour et puisse afficher la notification à l’utilisateur.

L’autre crochet à utiliser est upgrader_source_selection . Quoi qu'il en soit, ce filtre est nécessaire pour gitlab car le nom du dossier téléchargé n’est pas le même que celui du thème, nous utilisons donc ce hook pour le renommer avec le nom correct. Si votre référentiel distant fournit un zip avec le nom correct, vous n'avez même pas besoin de ce hook.

Le troisième crochet optionnel que vous pouvez utiliser est auto_update_theme si vous souhaitez mettre à jour automatiquement votre thème. Dans l'exemple ci-dessous, j'utilise ce crochet pour mettre à jour automatiquement ce thème spécifique uniquement.

Ce code n'a été testé qu'avec WordPress 4.9.x. Il nécessite 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 );
  }
}
    
réponse donnée Nathan Johnson 03.03.2018 - 19:37

Lire d'autres questions sur les étiquettes