Aggiornamenti per un plugin privato?
Se sviluppo un plugin privato, c'è un modo per utilizzare il meccanismo di aggiornamento automatico di WordPress per aggiornarlo?
Voglio incapsulare la funzionalità, ma è specifica per i miei 5 o più blog, quindi non è un candidato adatto per il repository pubblico dei plugin. Però adoro il meccanismo di aggiornamento facilitato.
Esiste un modo per farlo?

Sembra che il codice applicabile si trovi in wp-includes/update.php
, wp_update_plugins()
:
$to_send = (object) compact('plugins', 'active');
$options = array(
'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3),
'body' => array( 'plugins' => serialize( $to_send ) ),
'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
);
$raw_response = wp_remote_post('http://api.wordpress.org/plugins/update-check/1.0/', $options);
Controlla specificamente api.wordpress.org. Tecnicamente parlando, sarebbe possibile passare una chiave all'interno di $to_send
per delegare il controllo, ma per quanto ne so non è una funzionalità supportata.
Se agganci l'azione set_site_transient_update_plugins
, potresti aggiungere i dettagli del tuo pacchetto in questa variabile. Sembra che questi valori saranno considerati attendibili quando esegui l'aggiornamento del plugin. Vedi wp-admin/update.php
e wp-admin/includes/class-wp-upgrader.php
. Dato il codice in queste due funzioni, penso che sarebbe possibile iniettare il tuo server di aggiornamento personalizzato, devi solo verificare come sono formattati i dettagli del pacchetto e adattarti a quello.

Questo plugin lo fa per te:
Aggiornamenti Automatici per Plugin Privati e Commerciali
Da tempo immemorabile, solo i plugin ospitati nella directory ufficiale di WordPress.org supportavano gli aggiornamenti automatici. Ora, ho scritto una libreria PHP che puoi utilizzare per aggiungere la funzionalità di aggiornamento automatico a qualsiasi plugin. Plugin pubblici, privati e commerciali - tutti possono ora beneficiare delle notifiche di aggiornamento automatico e degli aggiornamenti con un solo click.

Potresti anche essere interessato a gestire i plugin sul tuo lato... magari con il pacchetto wp-update-server
, scritto dallo stesso autore ;) https://github.com/YahnisElsts/wp-update-server Utilizzando questo server, puoi proteggere i tuoi plugin, come descritto qui: http://w-shadow.com/blog/2013/03/19/plugin-updates-securing-download-links/

come posso disabilitare il controllo degli aggiornamenti predefinito di WordPress per i plugin gratuiti?

Anche se quel sito sembra datato, il progetto è molto attivamente supportato e funziona anche con repository privati Bitbucket/Github! Dai un'occhiata al loro repository Github per maggiori informazioni sulle diverse integrazioni disponibili https://github.com/YahnisElsts/plugin-update-checker

Dalla versione 5.8 di WordPress, è diventato molto più semplice creare una versione base di funzionalità personalizzata per gli aggiornamenti dei plugin.
Passo 1
Crea un file JSON sul tuo server. Conterrà informazioni sull'ultima versione del tuo plugin (o plugin) e il link al file ZIP che WordPress scaricherà automaticamente quando verrà attivato l'aggiornamento.
Esempio di percorso: https://my-domain.com/custom-plugins/plugins-info.json
Esempio di contenuto:
{
"my-plugin/my-plugin.php":{
"version":"1.1",
"package":"https://my-domain.com/custom-plugins/my-plugin.zip"
}
}
Puoi aggiungere informazioni per più plugin in questo JSON. Assicurati solo che la chiave per ogni plugin sia nel formato nome_directory/nome_file.php.
Naturalmente, solo quando la versione del plugin nel JSON è maggiore della versione installata, WordPress mostrerà che è disponibile un nuovo aggiornamento.
Per la lista completa dei dati che puoi impostare nel file JSON, controlla il parametro $update qui
Passo 2
Aggiungi "Update URI" al file principale del plugin (nella sezione dei commenti). Dovrebbe puntare al tuo file JSON personalizzato creato nel passo 1.
<?php
/**
* Plugin Name: My plugin
* Version: 1.0
* Update URI: https://my-domain.com/custom-plugins/plugins-info.json
*
*/
Passo 3
Aggiungi questo codice al file principale del tuo plugin personalizzato (o a functions.php)
IMPORTANTE: Cambia "my-domain.com" all'interno della funzione add_filter con il dominio effettivo che stai utilizzando per il file JSON.
if( ! function_exists( 'my_plugin_check_for_updates' ) ){
function my_plugin_check_for_updates( $update, $plugin_data, $plugin_file ){
static $response = false;
if( empty( $plugin_data['UpdateURI'] ) || ! empty( $update ) )
return $update;
if( $response === false )
$response = wp_remote_get( $plugin_data['UpdateURI'] );
if( empty( $response['body'] ) )
return $update;
$custom_plugins_data = json_decode( $response['body'], true );
if( ! empty( $custom_plugins_data[ $plugin_file ] ) )
return $custom_plugins_data[ $plugin_file ];
else
return $update;
}
add_filter('update_plugins_my-domain.com', 'my_plugin_check_for_updates', 10, 3);
}

Se ti piacciono i servizi gratuiti ... e vuoi usare qualcosa come GitHub, GitLab o BitBucket, questo è un plugin di buona qualità e supportato per gestirli (supporta anche privati ed enterprise):

Sto esaminando la stessa cosa. Ecco un paio di link che ho trovato e che potrebbero essere utili:
Il primo contiene alcune informazioni e riferimenti all'API degli aggiornamenti. Il secondo è un frammento di codice che mostra come effettivamente richiedere informazioni dall'API.
get_api_data()
<?php
/*
Recupera elementi dall'API dei plugin
*/
function get_api_data($per_page, $page)
{
$fields = array(
'downloaded' => true,
'author' => false,
'author_profile' => false,
'contributors' => false,
'requires' => true,
'tested' => false,
'compatibility' => false,
'homepage' => false,
'description' => false,
'last_updated' => true,
'added' => true
);
$body = (object) array('browse' => 'new', 'page' => $page, 'per_page' => $per_page, 'fields' => $fields);
$post_data = array('action' => 'query_plugins', 'request' => serialize($body));
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_URL, 'http://api.wordpress.org/plugins/info/1.0/');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$return = curl_exec($ch);
curl_close($ch);
return unserialize($return);
}

Se desideri una soluzione ospitata che non devi gestire, dai un'occhiata a Kernl (https://kernl.us). È un servizio che fornisce l'infrastruttura per aggiornare i plugin e rende semplice l'integrazione nei tuoi plugin personalizzati.

Potresti voler dare un'occhiata al plugin WordPress Development Kit. Recentemente ho migrato il mio sistema di aggiornamento proprietario a questo plugin. Ora il plugin funge da processore back-end per gli aggiornamenti dei miei plugin premium.
Questa configurazione è simile alla soluzione fornita da agileapricot sopra. Si installerà come un plugin standard su un sito WordPress. Ospiterai i tuoi file .zip premium e il plugins.json in directory di produzione o prerelease sul tuo server (specificate nelle impostazioni del plugin).
Il plugin ti permette anche di elencare le versioni dei plugin e può persino fornire un download dei file su pagine pubbliche, protette da password o da abbonamento. Puoi vedere un esempio della lista delle versioni in pagina qui.
Sto utilizzando questo plugin da mesi per pubblicare il changelog dei miei add-on premium, la lista delle versioni correnti e le liste di download per i detentori del mio Abbonamento Premier. Ora, con la versione 0.7.01, funziona come destinazione delle query per gli aggiornamenti inline di WordPress.
Spero che alcuni di voi lo trovino utile.

Se sei interessato a creare il tuo server di aggiornamento, è abbastanza semplice farlo senza utilizzare librerie, usando solo due hook dei filtri: plugins_api
e site_transient_update_plugins
plugins_api
– utilizzato per ottenere le informazioni del plugin e visualizzarle nella finestra modale, esempio:
site_transient_update_plugins
è necessario per inviare l'aggiornamento dal tuo server.
Maggiori informazioni in questo tutorial: https://rudrastyh.com/wordpress/self-hosted-plugin-update.html

Ho provato il tuo codice ma ricevo l'errore Parse error: syntax error, unexpected '{' in

In questo codice sto ricevendo l'errore // non fare nulla se non riceviamo la risposta corretta dal server if( is_wp_error( $remote ) || 200 !== wp_remote_retrieve_response_code( $remote ) || empty( wp_remote_retrieve_body( $remote ) ) { return $res; }
