Btw
Je winkelwagen

Je winkelwagen is leeg.

Recept: de data van je plugin in Gereedschap > Content

Doel: de data van je plugin staat in Gereedschap > Content onder "Andere onderdelen". Een site-eigenaar exporteert die naar een bestand, importeert hem op een andere site met eerst een voorbeeld, en maakt de import ongedaan als hij zich bedenkt.

Berichten, pagina's, producten en hun termen gaan al mee. Een bron is voor al het andere: instellingen, rijen uit een eigen tabel, alles wat geen bericht is.

De bron

Een bron implementeert AddoBack\Modules\Transfer\TransferSource. Addofy doet de rest: het bestand, de stappen voor grote exports, het voorbeeld met per item bijwerken, als nieuw toevoegen of overslaan, het rapport, ongedaan maken, WP-CLI en ophalen van een andere site met een sleutel.

use AddoBack\Modules\Transfer\TransferSource;

final class Myplugin_Forms_Source implements TransferSource {

	public function id(): string {
		return 'myplugin-forms'; // Vast, kleine letters, met je plugin ervoor.
	}

	public function label(): string {
		return __( 'My plugin forms', 'myplugin' );
	}

	public function cap(): string {
		return 'manage_options'; // Wie dit mag exporteren en importeren.
	}

	public function remote(): bool {
		return true; // Geef false voor persoonsgegevens: een sleutel op een andere site kan het dan niet ophalen.
	}

	public function count(): int {
		return myplugin_count_forms();
	}

	public function export( int $offset, int $limit ): array {
		$items = array();
		foreach ( myplugin_get_forms( $offset, $limit ) as $form ) {
			$items[] = array(
				'key'   => $form->uuid,      // Uniek en op elke site hetzelfde.
				'title' => $form->name,      // Staat in het voorbeeld.
				'data'  => $form->to_array(),
			);
		}
		return $items;
	}

	public function match( array $item ): string {
		return myplugin_form_exists( $item['key'] ) ? $item['key'] : ''; // '' betekent nieuw hier.
	}

	public function diff( array $item, string $existing ): array {
		return myplugin_form_changes( $existing, $item['data'] ); // Labels, zoals array( 'Velden' ).
	}

	public function import( array $item, string $mode, string $existing ): array {
		$data   = myplugin_clean_form( $item['data'] ); // Het bestand kan overal vandaan komen: schoon het op.
		$before = 'update' === $mode ? myplugin_get_form( $existing ) : null;
		$id     = 'update' === $mode ? myplugin_update_form( $existing, $data ) : myplugin_add_form( $data );
		return array( 'id' => $id, 'before' => $before ); // Wat undo() nodig heeft.
	}

	public function undo( array $record ): void {
		null === $record['before'] ? myplugin_delete_form( $record['id'] ) : myplugin_restore_form( $record['before'] );
	}
}

Aanmelden

add_action( 'adba_transfer_register_sources', function ( $sources ) {
	if ( interface_exists( 'AddoBack\Modules\Transfer\TransferSource' ) ) {
		$sources->add( new Myplugin_Forms_Source() );
	}
} );

Laad het classbestand alleen binnen die check, dan blijft je plugin werken met een oudere Addofy of zonder Addofy.

Regels

  • Schoon op in import(). Addofy controleert de vorm van een item, niet de data. Behandel data als invoer van een gebruiker.
  • Vaste sleutels. De sleutel bepaalt of een item nieuw is of een update. Een database-id is tussen sites niet vast; een uuid of slug wel.
  • Ongedaan maken doe je zelf. Geef alles terug wat je nodig hebt om de site terug te zetten. Records komen terug van nieuw naar oud en blijven een week bewaard.
  • Faal per item. Gooi een exception in import() en het item staat als mislukt in het rapport; de rest van de import gaat door.
  • Persoonsgegevens blijven thuis. Geef false uit remote() voor alles over mensen. De bron zit dan alleen in bestanden die de site-eigenaar zelf downloadt.
  • Geen filters op bron-items. adba_transfer_export_item en adba_transfer_import_item zijn voor berichten, producten en termen. Je bron bepaalt zelf wat er in zijn items zit.

Probeer het met WP-CLI: wp adba content export --type=myplugin-forms --user=admin.

Klaar om je AI te koppelen aan echte tools?

Start gratis proefperiode