Import automat fișier XML WordPress din functions.php

18 apr. 2013, 02:49:14
Vizualizări: 14.1K
Voturi: 7

Dezvolt o temă care are o metodă diferită de adăugare a conținutului și astfel, instalarea implicită a WordPress nu va afișa niciun conținut din acest motiv. Mă întrebam dacă este posibil să import automat un fișier XML prin intermediul unei funcții interne și/sau hook-uri după activarea temei?

Utilizatorul instalează tema > Utilizatorul activează tema > Codul din spate încarcă un fișier XML și efectuează un import silențios al conținutului său

În prezent, pentru a importa un fișier XML trebuie să instalezi plugin-ul WordPress Importer și apoi să importezi manual fișierul, să selectezi un utilizator pentru asocierea conținutului importat și să decizi dacă dorești să imporți atașamentele media. Consider că acest pas este prea confuz pentru tipul de clienți pe care îi vizez și aș dori să elimin efectiv nevoia acestui pas.

Am cercetat scriptul WordPress Importer și există multe apeluri de funcții. Ce ar trebui să fac pentru a elimina părțile unde este necesară introducerea de către utilizator și să importez un fișier folosind direct clasa și metodele acesteia? Nu sunt sigur de unde să încep.

Clienții mei sunt meșteri, așa că chiar și ceva aparent simplu ca importul unui fișier XML îi încurcă, iar ei nu au timp să o facă, existând riscul de eroare, mai ales dacă încearcă să importe de mai multe ori, ceea ce ar duce la pagini duplicate.

Mulțumesc anticipat.

Edit/Clarificare

Se pare că există multă confuzie aici. Nu întreb cum să verific dacă o temă a fost activată - am rezolvat deja acea parte. Întreb cum aș putea parsa un fișier XML de import și să îl import automat fără efort din partea utilizatorului. În esență, doresc să automatizez plugin-ul de import WordPress pe care îl poți folosi deja pentru a importa manual fișierul XML, alege autorul, alege să descarci și să imporți atașamentele, dar să fac asta direct în functions.php.

Scopul este să nu fie nevoie de un plugin sau să nu fie necesar ca clienții mei, care au cunoștințe limitate de calculator sau dorință de a învăța cum să folosească plugin-ul, să efectueze acest pas.

2
Comentarii

Practic, ceri cuiva să facă munca pentru tine. Ia în considerare să angajezi un developer WordPress pentru asta, mai ales că pare a fi o activitate comercială (menționezi clienți).

anu anu
26 apr. 2013 09:28:13

Nu cer nimănui să facă "munca" pentru mine. Nu ar trebui să faci presupuneri, Anu, mai ales când sunt neadevărate. Cer îndrumări cu privire la cel mai bun mod de a face ceva în WordPress. Sunt membru al acestui site de suficient timp, Anu, pentru a ști diferența dintre o întrebare și cererea de muncă gratuită. Spui că întrebarea mea nu este validă dacă se referă la o activitate comercială? Nu am voie să cer ajutor dacă e vorba de un site pentru care sunt plătit să-l construiesc? Presupun că 90% dintre întrebările de pe acest site sunt de la freelanceri...

Dwayne Charrington Dwayne Charrington
30 apr. 2013 12:10:55
Toate răspunsurile la întrebare 4
3
20

Întrebarea ta este puțin specifică dacă vrei "doar" să imporți automat niște articole/pagini. Există alte modalități de a face acest lucru decât folosind un fișier de export XML.

Dacă ai articole doar cu text, atunci ar trebui să folosești LOAD DATA INFILE. Mai întâi trebuie să îți exporti articolele.

global $wpdb, $wp_filesystem;

$tables = array(
        'posts'    => array( 'posts', 'postmeta' ),
        'comments' => array( 'comments', 'commentmeta' ),
        'terms'    => array( 'terms', 'term_taxonomy', 'term_relationships' ),
        'users'    => array( 'user', 'usermeta' ),
        'links'    => array( 'links' ),
        'options'  => array( 'options' ),
        'other'    => array(),
        // pentru multisite
        'multiside' => array( 'blogs', 'signups', 'site', 'sitemeta', 'sitecategories', 'registration_log', 'blog_versions' )

);

$exports = array( 'posts', 'comments', 'users' );

$exportdir = TEMPLATEPATH . '/export';

if ( ! is_dir( $exportdir ) ) {
    $mkdir = wp_mkdir_p( $exportdir );
    if ( false == $mkdir || ! is_dir( $exportdir ) )
        throw new Exception( 'Nu se poate crea directorul de export. Se întrerupe.' );
}

// golim directorul de export altfel MySQL va arunca erori
$files = glob( $exportdir . '/*' );
if ( ! empty( $files ) ) {
    foreach( $files as $file )
        unlink( $file );
}

foreach ( $exports as $export ) {

    if ( ! isset( $tables[$export] ) )
        continue;

    if ( ! empty( $tables[$export] ) ) {
        foreach ( $tables[$export] as $table ) {

            $outfile =  sprintf( '%s/%s_dump.sql', $exportdir, $table );
            $sql = "SELECT * FROM {$wpdb->$table} INTO OUTFILE '%s'";
            $res = $wpdb->query( $wpdb->prepare( $sql, $outfile ) );

            if ( is_wp_error( $res ) )
                echo "<p>Nu se poate exporta {$table} în {$outfile}</p>";
        }
    }
}

Aceasta va crea un director în folderul temei tale (asigură-te că are drepturi de scriere!) și va exporta articolele și comentariile (cu meta datele lor) în fișiere dump. Folosește array-ul export pentru a defini ce vrei să exporți. Am grupat majoritatea lucrurilor mai mult sau mai puțin logic (dacă vrei să exporți articolele, atunci ar trebui să exporți și postmeta și așa mai departe).

Beneficiul acestei soluții este că, cu instrucțiunea SELECT poți defini lucruri specifice (de exemplu, doar articole dintr-o anumită categorie sau doar pagini sau doar articole șterse).

Acum vrei să imporți aceste lucruri într-un nou blog

global $wpdb;

$exportdir = TEMPLATEPATH . '/export';

$files = glob( $exportdir . '/*_dump.sql' );

foreach ( $files as $file ) {

    preg_match( '#/([^/]+)_dump.sql$#is', $file, $match );

    if ( ! isset( $match[1] ) )
        continue;

    $sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE {$wpdb->$match[1]};";

    $res = $wpdb->query( $wpdb->prepare( $sql, $file ) );

    if ( is_wp_error( $res ) )
        echo "<p>Nu se poate importa datele din fișierul {$file} în tabela {$wpdb->$match[1]}</p>";
}

Această soluție este bună dacă articolele nu conțin atașamente precum imagini. O altă problemă este că niciun utilizator și nicio categorie nu vor fi importate. Asigură-te că ambele sunt create înainte de a începe importul (sau include utilizatori și categorii în exportul tău). Este o metodă foarte brută de a importa lucruri, va suprascrie elementele existente!

Dacă vrei să exporți și atașamentele, trebuie să faci un pic mai multă muncă.

(Notă laterală: Te rog să citești întregul răspuns și Cuvintele Finale la sfârșit! Acest subiect nu este pentru începători și nu voi scrie un avertisment la fiecare linie de cod riscantă)

Plugin-ul WordPress Importer pare a fi o modalitate bună de a importa totul și de a descărca automat atașamentele. Așadar, să vedem ce va face acest plugin.

Mai întâi, pluginul cere un fișier XML pentru încărcare. Apoi parsează fișierul XML și întreabă despre maparea autorului și dacă atașamentele ar trebui descărcate sau nu.

Pentru o rulare automată a pluginului, trebuie să schimbăm câteva lucruri. Mai întâi trebuie să sărim peste procesul de încărcare. Asta e destul de ușor pentru că poți include fișierul XML în temă și știi unde se află fișierul XML. Apoi trebuie să sărim peste întrebările care apar după încărcarea fișierului XML. Putem predefini propriile noastre valori și să le transmitem procesului de import.

Începe cu o copie a pluginului. Creează un director în tema ta, de exemplu autoimport și copiază fișierele wordpress-importer.php și parsers.php în el. Este o idee bună să redenumești fișierul wordpress-importer.php în ceva de genul autoimporter.php. În funcțiile temei, adaugă un apel de funcție pentru a declanșa importul automat

/**
 * Import automat un fișier XML
 */
add_action( 'after_setup_theme', 'autoimport' );

function autoimport() {
    // obține fișierul
    require_once TEMPLATEPATH . '/autoimport/autoimporter.php';

    if ( ! class_exists( 'Auto_Importer' ) )
        die( 'Auto_Importer nu a fost găsit' );

    // apelează funcția
    $args = array(
        'file'        => TEMPLATEPATH . '/autoimport/import.xml',
        'map_user_id' => 1
    );

    auto_import( $args );

}

Mai întâi setăm câteva argumente. Primul lucru este calea completă către fișierul XML. Al doilea este ID-ul unui utilizator existent. Avem nevoie de acest utilizator pentru maparea autorului, acesta este utilizatorul căruia îi vor fi atribuite toate articolele atunci când nu se doresc creări de autori noi.

Acum trebuie să înțelegem cum funcționează pluginul. Deschide fișierul pluginului redenumit și derulează până la sfârșit. Există o funcție wordpress_importer_init() și un apel de acțiune. Elimină ambele, nu mai sunt necesare. Acum mergi în partea de sus a fișierului și elimină antetul pluginului (comentariul de la începutul fișierului). După aceea, redenumește clasa WP_Importer în ceva de genul Auto_Importer, nu uita să ajustezi declarația function_exists și prima metodă WP_Importer (aceasta este constructorul în stil PHP4).

Mai târziu vom transmite fișierul XML direct constructorului clasei, modifică prima metodă astfel

var $xmlfile = '';
var $map_user_id = 0;

function Auto_Importer( $args ) {

    if ( file_exists( $args['file'] ) ) {

        // pentru sistemele Windows
        $file = str_replace( '\\', '/', $args['file'] );

        $this->xmlfile = $file;
    }

    if ( isset( $args['map_user_id'] ) )
        $this->map_user_id = $args['map_user_id'];

}

Acum trebuie să eliminăm și să modificăm câteva metode din interiorul clasei. Prima metodă este metoda dispatch(). Această metodă îți spune cum funcționează clasa. Ea face trei pași. Mai întâi încarcă fișierul XML, apoi îl procesează și în final importă datele.

Cazul zero este primul pas, este salutul. Aceasta este partea pe care o vezi dacă apelezi importul pentru prima dată. Va cere un fișier pentru încărcare. Cazul doi gestionează încărcarea și afișează un formular pentru opțiunile de import. Cazul trei efectuează în final importul. Cu alte cuvinte: primii doi pași doar solicită date pe care le putem furniza noi înșine. Avem nevoie doar de pasul 3 (cazul 2) și trebuie să furnizăm datele solicitate în pasul unu și doi.

În pasul doi vezi un apel de funcție la wp_import_handle_upload(). Această funcție stabilește câteva informații despre fișierul xml. Nu mai putem folosi această funcție pentru că nu am încărcat un fișier. Așadar, trebuie să copiem și să modificăm funcția. Creează o nouă metodă în cadrul clasei

function import_handle_upload() {

    $url = get_template_directory_uri() . str_replace( TEMPLATEPATH, '', $this->xmlfile );
    $type = 'application/xml'; // știm tipul mime al fișierului nostru
    $file = $this->xmlfile;
    $filename = basename( $this->xmlfile );

    // Construim array-ul obiectului
    $object = array( 'post_title' => $filename,
            'post_content' => $url,
            'post_mime_type' => $type,
            'guid' => $url,
            'context' => 'import',
            'post_status' => 'private'
    );

    // Salvăm datele
    $id = wp_insert_attachment( $object, $file );

    // programăm o curățare pentru peste o zi de acum, în caz de import eșuat sau apel lipsă wp_import_cleanup()
    wp_schedule_single_event( time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array( $id ) );

    return array( 'file' => $file, 'id' => $id );
}

Și înlocuiește apelul funcției $file = wp_import_handle_upload(); în metoda handle_upload() cu noua noastră metodă $file = $this->import_handle_upload();

Am înlocuit acum procesul de încărcare cu propriul nostru fișier (care ar trebui să existe deja). Continuă și elimină mai multe metode inutile. Metodele greet(), header() și footer() nu mai sunt necesare (header și footer doar afișează câteva text) și pot fi eliminate din clasă. În metoda dispatch() elimină apelurile către aceste metode ($this->header() și $this->footer()).

Primul pas este gata, acum trebuie să ne ocupăm de al doilea pas, opțiunile de import. Opțiunile de import întreabă dacă ar trebui permisă descărcarea atașamentelor și maparea autorilor.

Prima parte este ușoară. Setează true dacă atașamentele ar trebui descărcate sau false dacă nu. Maparea autorilor este un pic mai complicată. Dacă este permisă crearea de utilizatori noi (autorii din fișierul de import), creează-i. Dacă nu, atribuie articolele unui utilizator existent. Acest lucru se face în metoda get_author_mapping(). Trebuie să înlocuim datele $_POST cu date existente. Aici avem nevoie de o soluție simplă, așa că pur și simplu mapăm toți autorii noi către unul existent dacă nu este permisă crearea de utilizatori noi. Sau pur și simplu creează toți utilizatorii noi. În al doilea caz, asigură-te că toți utilizatorii noi sunt utilizatori dummy. Dacă nu, de fiecare dată când îi imporți, ei vor primi un email cu datele de autentificare în noul blog!! Nu voi explica fiecare linie de cod, iată metoda rescrisă complet

function get_author_mapping( $map_users_id ) {
    if ( empty( $this->authors ) )
        return;

    $create_users = $this->allow_create_users();

    foreach ( (array) $this->authors as $i => $data ) {

        $old_login = $data['author_login'];

        // Multisite adaugă strtolower la sanitize_user. Trebuie să facem sanitize aici pentru a evita erori în process_posts.
        $santized_old_login = sanitize_user( $old_login, true );
        $old_id = isset( $this->authors[$old_login]['author_id'] ) ? intval($this->authors[$old_login]['author_id']) : false;

        if ( ! $create_users ) {
            $user = get_userdata( intval($map_users_id) );
            if ( isset( $user->ID ) ) {
                if ( $old_id )
                    $this->processed_authors[$old_id] = $user->ID;
                $this->author_mapping[$santized_old_login] = $user->ID;
            }
        } else if ( $create_users ) {
            if ( ! empty($this->authors[$i]) ) {
                $user_id = wp_create_user( $this->authors[$i]['author_login'], wp_generate_password() );
            } else if ( $this->version != '1.0' ) {
                $user_data = array(
                    'user_login' => $old_login,
                    'user_pass' => wp_generate_password(),
                    'user_email' => isset( $this->authors[$old_login]['author_email'] ) ? $this->authors[$old_login]['author_email'] : '',
                    'display_name' => $this->authors[$old_login]['author_display_name'],
                    'first_name' => isset( $this->authors[$old_login]['author_first_name'] ) ? $this->authors[$old_login]['author_first_name'] : '',
                    'last_name' => isset( $this->authors[$old_login]['author_last_name'] ) ? $this->authors[$old_login]['author_last_name'] : '',
                );
                $user_id = wp_insert_user( $user_data );
            }

            if ( ! is_wp_error( $user_id ) ) {
                if ( $old_id )
                    $this->processed_authors[$old_id] = $user_id;
                $this->author_mapping[$santized_old_login] = $user_id;
            } else {
                printf( __( 'Nu s-a putut crea un utilizator nou pentru %s. Articolele lor vor fi atribuite utilizatorului curent.', 'wordpress-importer' ), esc_html($this->authors[$old_login]['author_display_name']) );
                if ( defined('IMPORT_DEBUG') && IMPORT_DEBUG )
                    echo ' ' . $user_id->get_error_message();
                echo '<br />';
            }
        }

        // fallback: dacă user_id a fost invalid, folosește utilizatorul curent
        if ( ! isset( $this->author_mapping[$santized_old_login] ) ) {
            if ( $old_id )
                $this->processed_authors[$old_id] = (int) get_current_user_id();
            $this->author_mapping[$santized_old_login] = (int) get_current_user_id();
        }
    }
}

Mai avem ceva de lucru. Adăugăm o funcție auto_import() mai întâi

function auto_import( $args ) {

    $defaults = array( 'file' => '', 'map_user_id' => 0);
    $args = wp_parse_args( $args, $defaults );

    $autoimport = new Auto_Importer( $args );
    $autoimport->do_import();

}

Plasează această funcție după clasă. Această funcție are nevoie de gestionare și verificare a erorilor (de exemplu, pentru un argument de fișier gol).

Dacă acum rulezi clasa, vei primi o mulțime de mesaje de eroare. Primul este că clasa lipsește. Acest lucru se datorează faptului că există o declarație if la început.

if ( ! defined( 'WP_LOAD_IMPORTERS' ) )
    return;

Trebuie să o eliminăm, altfel fișierul nu ar fi analizat complet. Apoi există câteva funcții care nu sunt încărcate în acest moment. Trebuie să includem câteva fișiere.

$required = array(
    'post_exists'                     => ABSPATH . 'wp-admin/includes/post.php',
    'wp_generate_attachment_metadata' => ABSPATH . 'wp-admin/includes/image.php',
    'comment_exists'                  => ABSPATH . 'wp-admin/includes/comment.php'
);

foreach ( $required as $func => $req_file ) {
    if ( ! function_exists( $func ) )
        require_once $req_file;
}

Practic, asta e tot. Am testat acest lucru pe o instalare locală cu datele de test XML de la WordPress. Funcționează pentru mine, dar nu este o soluție perfectă pentru producție!

Și câteva ultime cuvinte despre setarea unor opțiuni. Există două opțiuni care pot fi modificate de un filtru:

add_filter( 'import_allow_create_users', function() { return false; } );
add_filter( 'import_allow_fetch_attachments', '__return_false' );

Cred că nu trebuie să le explic. Pune aceste filtre în functions.php și setează true sau false (primul este în stil PHP5.3, al doilea în stil WP).

Cuvintele Finale

Am pus totul împreună în acest gist. Folosește-l pe propria răspundere! Nu sunt responsabil pentru nimic!. Te rog să te uiți la fișierele din gist, nu am explicat fiecare mic pas aici.

Lucruri pe care nu le-am făcut: Setați o valoare, de exemplu, în opțiunile (temei) după import. Altfel, importul va începe de fiecare dată când tema este activată.

Poate voi lucra la asta în viitor, voi curăța câteva lucruri și voi rula mai multe teste.

27 apr. 2013 20:43:20
Comentarii

Doamne. E o carte.

kaiser kaiser
28 apr. 2013 21:50:31

Unele lucruri nu pot fi explicate cu câteva cuvinte ;)

Ralf912 Ralf912
29 apr. 2013 10:51:03

Wow. Pur și simplu wow. Acesta este unul dintre cele mai detaliate și impresionante răspunsuri pe care le-am văzut vreodată pe acest site, felicitări ție. După ce am petrecut o jumătate de zi citind acest lucru, am ajuns la concluzia că aceasta este calea corectă de urmat. Mi-ai dat multe de gândit, dar aceasta este cu siguranță direcția potrivită. Mulțumesc că ți-ai luat timpul să lași acest răspuns.

Dwayne Charrington Dwayne Charrington
29 apr. 2013 12:57:21
0

Permiteți-mi să reintroduc două aspecte aici:

(a) "Nu întreb cum să... Am rezolvat deja acea parte..."

»» Am învățat de-a lungul timpului să accept faptul că abordarea problemelor/remediilor nu necesită neapărat o 'asociere vizibilă' cu problema în sine.

(b) "...ar trebui să fac pentru a elimina părțile..." "...clienții sunt meșteșugari, deci chiar și ceva atât de simplu ca..."

»» De ce să faci lucrurile mai ușoare pentru client în detrimentul dificultății tale? Cu siguranță aș putea oferi 'servicii' după livrare și să stabilesc o conexiune la distanță pentru a face asta pentru ei [plătit], în loc să "...hack-ui plugin-ul de import...". Adică, întreabă-te dacă merită cu adevărat în schema ta actuală. Totuși, DACĂ ești dispus să depui efortul, atunci încearcă codul de mai jos. Dacă poți, atunci:

Sunt de acord atât cu chrisguitarguy, cât și cu amolv mai sus.

După cum a subliniat chris, există multe modalități de a obține un rezultat. Aceasta este doar una. Deși are potențialul de a deveni laborios de lung, consultă ultimele două rânduri înainte de orice altceva.

<?php 
/* De obicei adaug O singură linie în functions.php  */
require_once (TEMPLATEPATH . '/includes/orice.php');

/* și apoi în acea locație VERIFICĂ MAI ÎNTÂI*/
if ((is_admin() && isset($_GET['activated']) && $pagenow == 'themes.php')||(is_admin() && isset($_GET['upgrade']) && $pagenow == 'admin.php' && $_GET['page'] == 'admin-options.php')) 
{

global $wpdb, $wp_rewrite, $hey;

// creează tabele
your_tables();

// inserează valori implicite
your_values();

// inserează linkuri implicite
your_links();

// pagini și șabloane
your_pages();

// creează categorie sau categorii
// wp_create_categories     $categories, $post_id = ''
// wp_create_category   $cat_name, $parent

//resetează regulile de rescriere
$wp_rewrite->flush_rules();

}

// creează tabelele în baza de date
function your_tables() {
global $wpdb, $hey;

$collate = '';
if($wpdb->supports_collation()) {
if(!empty($wpdb->charset)) $collate = "DEFAULT CHARACTER SET $wpdb->charset";
if(!empty($wpdb->collate)) $collate .= " COLLATE $wpdb->collate";
}

$sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "table1_name" ." (
`id` INT(10) NOT NULL auto_increment,
`some_name1` VARCHAR(255) NOT NULL,
`some_name2` VARCHAR(255) NOT NULL,
`some_name3` LONGTEXT,
`some_name4` LONGTEXT NOT NULL,
`some_name5` VARCHAR(255) DEFAULT NULL,
`some_name6` VARCHAR(255) DEFAULT NULL,
`some_name7` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`some_name8` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY id  (`id`)) $collate;";

$wpdb->query($sql);


$sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "table2_name" ." (
`meta_id` INT(10) NOT NULL AUTO_INCREMENT,
`some_name1` INT(10) NOT NULL,
`some_name2` INT(10) NOT NULL,
`some_name3` VARCHAR(255) NOT NULL,
`some_name4` INT(10) NOT NULL,
PRIMARY KEY id  (`meta_id`)) $collate;";

$wpdb->query($sql);

// și tot așa mai departe

/* Inserează date implicite/TOATE în tabele */
// DAR VERIFICĂ MAI ÎNTÂI DACĂ DATELE EXISTĂ. DACĂ = DA, NU INSERA NIMIC

$sql = "SELECT field_id " . "FROM " . $wpdb->prefix . "table1_name LIMIT 1";

$wpdb->get_results($sql);

if($wpdb->num_rows == 0) {

// urmează mai mult cod
// trebuie să plec acum

} 

?>

NOTĂ

  • Dacă folosești WP de ceva vreme, e inutil să menționez SĂ FACI O COPIE DE REZERVĂ A BAZEI DE DATE ÎNAINTE.

  • phpMyAdmin are putere brută și face destul de ușor să strici lucrurile cu grijă.

  • Deși efortul necesar poate părea descurajant la început, dacă e făcut corect, poți să-l faci să funcționeze ca un ceas... ф ...

În final

Cum să introduci 2000 de linii de date în 20 secunde în acele ultimele 2 linii din acele 2 acolade?

phpMyAdmin » Selectează baza de date în stânga »» Selectează TOATE TABELELE în dreapta »» Exportă ▼

➝ Personalizat: afișează toate opțiunile
➝ Afișează rezultatul ca text = ON
➝ Salvează rezultatul într-un fișier = OFF
➝ Compresie = NICIUN
➝ Format = SQL
➝ Dump Table = STRUCTURĂ & DATE
➝ Adaugă DROP TABLE... = OFF (Important!)
➝ Sintaxă de utilizat = "ambele de mai sus"

»» GO!
  • De pe următorul ecran pot copia partea de 'STRUCTURĂ' în $sql = "...." pentru your_tables() și porțiunea de 'DATE' în $sql pentru your_data()

  • Pentru restul setărilor implicite din WP folosesc update_option(...) & update_post_meta(...)

26 apr. 2013 15:55:56
1

Nu există un echivalent al temei pentru register_activation_hook pentru plugin-uri — există câteva solutii alternative. De ce? Pentru că o temă este doar un aspect vizual. Doar funcționalitățile specifice afișării conținutului ar trebui să fie într-o temă, nu conținutul în sine.

În ceea ce privește cum să faci acest lucru: folosește exemplul de mai sus pentru a rula o funcție callback o singură dată. Importatorul WordPress funcționează pe fișiere XML și există multe diferite modalități de a analiza XML în PHP. Alege cea care ți se potrivește, analizează fișierul și fă ce dorești cu el.

18 apr. 2013 03:46:54
Comentarii

Mulțumesc, Chris. Problema nu este găsirea unui hook potrivit pentru detectarea activării unei teme (am rezolvat deja acea parte), ci găsirea unei metode de a importa automat un fișier XML în WordPress. Am fișierul XML într-un folder din directorul temei mele numit "importxml". Aș prefera să folosesc importatorul existent din WordPress, să elimin partea manuală și să-l folosesc pentru a încărca fișierul meu XML fără ca utilizatorul să fie nevoit să facă ceva.

Dwayne Charrington Dwayne Charrington
18 apr. 2013 03:53:48
2

în functions.php condiția poate fi verificată

if( isset($_GET['activated']) && 'themes.php' == $GLOBALS['pagenow']) )
{ 
  // verifică duplicate 
   // apelează clasa de import 
   // cod pentru import xml 
   // faci orice dorești 
}

Imediat ce tema ta este activată, acest cod va importa automat datele.

26 apr. 2013 06:42:41
Comentarii

Mulțumesc pentru postare, amolv. Totuși, nu întreb cum să verific dacă o temă a fost activată (deja fac asta). Mai degrabă doresc să aflu cum să analizez și să import automat un fișier XML fără intervenția utilizatorului.

Dwayne Charrington Dwayne Charrington
26 apr. 2013 08:33:10

În pluginul wordpress-importer există doar 2 fișiere pentru a înțelege cum se face acest lucru. Pur și simplu copiază acele fișiere în tema și folosește clasa WP_Import, apoi apelează funcția de import trecând calea fișierului ca parametru - asta e tot.

amolv amolv
26 apr. 2013 10:11:31