ব্যক্তিগত API থেকে প্লাগইন আপডেট করুন


9

আমি এই মুহুর্তে একটি ওয়ার্ডপ্রেস প্লাগইন বিকাশ করছি যা আমি ওয়ার্ডপ্রেস প্লাগইন সংগ্রহস্থলে চাই না। তবে আমি এখনও আমার নিজস্ব এপিআই সংগ্রহস্থল থেকে আমার মূল্যবানদের আপডেট আপডেট করতে সক্ষম হতে চাই।

আমি এই সম্পর্কে বেশ কিছুটা পড়ছি, এবং একটি জিনিস যা সম্পর্কে কিছু বলে মনে হচ্ছে তা হ'ল pre_set_site_transient_update_pluginsফিল্টার, তবে আমি এই সম্পর্কে খুব বেশি তথ্য পাই না। আমি এই টিউটোরিয়ালটি চেষ্টা করেছি ( http://konstruktors.com/blog/wordpress/2538-automatic-updates-for-plugins-and-themes-hosted-outside-wordpress-extend/ ) যা আমি কাজ করতে পারি না। আমি মন্তব্য থেকে বলতে পারি যে অন্যরা ডাব্লুপি এর প্রায় বর্তমান সংস্করণ (সর্বশেষ প্রতিক্রিয়া এপ্রিল 22) হওয়া উচিত এটি নিয়ে এই কাজটি করতে পারে।

আমি সাইট থেকে প্লাগইনটি ইনস্টল করার এবং দ্বিতীয় ডোমেনে এপিআই ফোল্ডারটি দেওয়ার চেষ্টা করেছি, তবে আপডেটটি পাওয়া গেলে সাধারণত আপডেট হওয়া বিজ্ঞপ্তিটি আমি কোথাও দেখায় না।

আমি নিশ্চিত নই যে কাস্টম প্লাগইনগুলি অন্য সংগ্রহস্থলগুলি থেকে অটো আপডেট চালানো সম্ভব কিনা তাই আমি শুনতে চাই যে এখানকার কারও কাছে এই স্টাফের সাথে কোনও অভিজ্ঞতা আছে কিনা? টিউটোরিয়ালের সমাধানটি একটি সহজ সমাধান বলে মনে হয়েছিল - আমি ভাবছি এটি আরও উন্নত উপায়ে করা কোনওভাবেই সম্ভব কিনা?

আমার নিজস্ব সংগ্রহস্থল কাজ করে এই অটো-আপডেট পেতে যে কোনও সহায়তা প্রশংসিত হবে!

(পিএস: আমি ডাব্লুপিপি সংস্করণ 3.1.3 চালাচ্ছি)


আমি পার্টিতে দেরিতে হতে পারি তবে আপনি তার জন্য ঠিক নির্মিত প্লাগইনটি পেতে পারেন: ডাব্লুপি প্লাগইন আপডেট সার্ভার
froger.me

উত্তর:


7

এই পৃষ্ঠাটি সন্ধানকারী অন্যের সুবিধার্থে, আমি তাদের অফিসিয়াল ডাব্লুপি সংগ্রহস্থলের বাইরে নিজস্ব আপডেট সরবরাহ করতে ইচ্ছুক যারা গিটিহাবের এই প্রকল্পটি পরীক্ষা করে দেখুন, যা কার্যকারিতাটি দেখায়:

https://github.com/jeremyclark13/automatic-theme-plugin-update


2

হ্যাঁ, এটি সম্ভব। এটিতে উত্সর্গীকৃত পেশাদার ওয়ার্ডপ্রেস প্লাগইন বিকাশের একটি সম্পূর্ণ অধ্যায় রয়েছে । আপনার যদি ইতিমধ্যে না থাকে তবে একটি অনুলিপি নিন। এটি অবশ্যই সাহায্য করবে।


আমি আসলে এই অনলাইন এর একটি পিডিএফ সংস্করণ খুঁজে পেয়েছি, তবে এটি আমার পক্ষে কাজ করে না বলে মনে হয়।
সাইমন

এটা তোলে কাজ করে আপনি এটি অধিকার, আমি এটা করেছি HTTP- র এপিআই তাকিয়ে থাক কেন, তাহলে codex.wordpress.org/HTTP_API
Wyck

আমি আবার শুরু করেছি। আমি এখন পর্যন্ত যা পেয়েছি তা প্লাগইন আপডেট চেকটি ব্যবহার add_filter("pre_set_site_transient_update_plugins","dne_altapi_check"); করে জেনে রাখা হচ্ছে তার পরে আমার ফাংশনটি dne_altapi_check রয়েছে যার মধ্যে রয়েছে print_r("hi");- তবে আমি যখন আপডেটগুলির অধীনে "আবার চেক করুন" বোতাম টিপব তখন এটি কোনও কিছুই মুদ্রণ করে না .. আমি কি আপডেট চেকারে hুকানোর সময় কিছু ভুল করছেন?
সাইমন

আমার মনে আছে কেউ প্লাগইন আপডেট স্টাফদের জন্য ক্লাস লিখেছিল, তবে সেই পোস্টের লিঙ্কটি খুঁজে পেতে পারে: /
মামাদুকা

1

WooCommerce এর জন্য এই বাণিজ্যিক প্লাগইন এবং থিম আপডেট এপিআই ম্যানেজার রয়েছে যা প্লাগইন বা থিমটি ওয়ার্ডপ্রেস.আরোগুলিতে হোস্ট করা না থাকলে বিশেষত কাজ করে। এটি স্ব-হোস্ট করা প্লাগইন এবং থিমগুলির আপডেট সরবরাহ করার জন্য ডিজাইন করা হয়েছে। প্লাগইন তাদের জন্য যারা এটি নিজে লিখতে চান না এবং তাদের জন্য প্রচুর বৈশিষ্ট্য, প্লাগইন এবং বিক্রি হওয়া থিমগুলির জন্য কাজের উদাহরণ প্রয়োজন।

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


1

Http://wp-updates.com/ এ একটি ঝরঝরে পরিষেবাও রয়েছে - আপনি একটি থিম বা প্লাগইন বিনামূল্যে পান। এফওয়াইআই - এটি আমার সাইট নয় তবে আমি এটি চেষ্টা করেছি কিছুক্ষণ আগে এবং এটি বেশ ভাল বলে মনে হয়েছিল।


একটি দুর্দান্ত পরিষেবা বলে মনে হচ্ছে, তবে আমি ওয়েব কন্ট্রোল প্যানেলে বা যোগাযোগের ক্ষেত্রে (প্রায় বিনামূল্যে পরিকল্পনায়) এইচটিটিপিএস লক্ষ্য করিনি: তদতিরিক্ত আপডেট চেক করার সময় আমি কোনও ধরণের মালিকানা চেক পাইনি (এটি আমার কাছে খুব সহজ মনে হয়েছে) অনুরোধ পোস্ট করুন), আমি মনে করি যে প্লাগইনটির নাম জেনে এবং কিছু অনুমান করে জিনিসগুলি চুরি করা যেতে পারে। সুরক্ষার দিক থেকে যদি কিছুটা বেশি পেশাদার মনে হয় তবে আমি এটি ব্যবহার করতে পছন্দ করতাম।
সত্যই সুন্দর

1

একটি একক-সাইট ইনস্টলের জন্য (আমি এটি কোনও বহু-সাইটে পরীক্ষা করে দেখিনি), গিথুব বা গিটল্যাবের মতো বাহ্যিক পরিষেবা থেকে আপনাকে কেবল দুটি হুক আপডেট করতে হবে। নীচের কোডে আমি গিটল্যাব ব্যবহার করি যেহেতু আমি এখনই আমার কোড হোস্ট করতে ব্যবহার করি। আমার সম্ভবত গিটল্যাব অংশগুলি বিমূর্ত করা উচিত ...

আপনার প্রথম হুকটি ব্যবহার করা দরকার pre_set_site_transient_update_themes। ওয়ার্ডপ্রেস এই ফিল্টারটি ব্যবহার করে আপডেটগুলি উপলব্ধ থাকে কিনা তা দেখানোর জন্য সাইট_ট্রান্সিয়েন্ট সেট করতে ব্যবহার করে। আপনার দূরবর্তী সংস্করণে সংযোগ করতে এবং এই আপডেটগুলি উপলব্ধ কিনা তা দেখতে এই হুকটি ব্যবহার করুন। যদি থাকে, তবে ক্ষণস্থায়ীটি পরিবর্তন করুন যাতে ওয়ার্ডপ্রেস জানতে পারে যে আপডেট রয়েছে এবং ব্যবহারকারীর কাছে বিজ্ঞপ্তিটি প্রদর্শন করতে পারে।

অন্য হুকটি আপনার ব্যবহার করা দরকার upgrader_source_selection। যাইহোক গিটল্যাবের জন্য এই ফিল্টারটি প্রয়োজন, কারণ ডাউনলোড করা ফোল্ডারের নাম থিমের মতো নয়, তাই আমরা এই হুকটিকে সঠিক নাম দিয়ে নতুন নামকরণ করতে ব্যবহার করি। যদি আপনি দূরবর্তী সংগ্রহস্থলটি সঠিক নামের সাথে একটি জিপ সরবরাহ করেন তবে আপনার এমনকি এই হুকের প্রয়োজন নেই।

তৃতীয়, alচ্ছিক, auto_update_themeআপনি যে থিমটি ব্যবহার করতে পারেন তা হ'ল যদি আপনি নিজের থিমটি স্বয়ংক্রিয়ভাবে আপডেট করতে চান। নীচের উদাহরণে, আমি কেবলমাত্র এই নির্দিষ্ট থিমটি স্বয়ংক্রিয়ভাবে আপডেট করতে এই হুকটি ব্যবহার করি।

এই কোডটি কেবল ওয়ার্ডপ্রেস ৪.৯.x. দিয়ে পরীক্ষা করা হয়েছে। এটির জন্য পিএইচপি> 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.