Pozwól użytkownikowi wybrać motyw, który ma zostać zainstalowany podczas rejestracji

11

Czy można pozwolić użytkownikowi wybrać motyw, który chciałby zainstalować na nowej stronie rejestracji witryny? A kiedy strona zostanie utworzona, oczywiście instaluje dowolny wybrany przez siebie motyw.

Znalazłem wp_get_themes . Czy w ten sposób zabrałbyś się do wypełniania menu rozwijanego wszystkimi dostępnymi motywami? W jaki sposób przekazujesz informacje o kompozycji do faktycznego procesu rejestracji, aby strona została utworzona z odpowiednim motywem?

Jeśli ktoś wie, jak to zrobić za pomocą formularzy grawitacyjnych, byłoby to również świetne.

Aktualizacja:

Oto, co mam do tej pory, nie bierze pod uwagę motywów potomnych, popracuję nad tym później

Ta funkcja wyświetli listę motywów z przyciskami opcji, przechowując wybrany motyw w $ _POST ['custom_theme']

/**
* Show list of themes at bottom of wp-signup.php (multisite)
*/
function 70169_add_signup_extra_fields() { ?>

Themes<br />
<?php
$themes = wp_get_themes();

foreach ( $themes as $theme ) {
    $theme_name = $theme['Name'];
    $theme_stylesheet = $theme->stylesheet;
?>
    <label>
        <input id="<?php echo $theme_stylesheet; ?>" type="radio" <?php if ( isset( $_POST['custom_theme'] ) ) checked( $_POST['custom_theme'], $theme_stylesheet ); ?> name="custom_theme" value="<?php echo $theme_stylesheet; ?>" ><?php echo $theme_name; ?>
    </label>

<?php } ?>

<?php }
add_action( 'signup_extra_fields', '70169_add_signup_extra_fields' );

Pomyślałem, że dodam ukryte pole jako sposób na przekazanie wartości motywu podczas tworzenia witryny. Jest w tym jednak coś nie tak - na ostatnim etapie traci swoją wartość, nie wiem jeszcze, dlaczego.

/**
 * Add a hidden field with the theme's value
 */
function 70169_theme_hidden_fields() { ?>

<?php
    $theme = isset( $_POST['custom_theme'] ) ? $_POST['custom_theme'] : null;
?>
<input type="hidden" name="user_theme" value="<?php echo $theme; ?>" />
<?php }
add_action( 'signup_hidden_fields', '70169_theme_hidden_fields' );

I wreszcie funkcja przekazywania nazwy motywu do nowo utworzonej witryny. Działa to, jeśli zmienię kod na stałe, ale nie jestem jeszcze w stanie przekazać wartości parametru custom_theme. Witryna została utworzona dobrze, ale opcje szablonu i arkusza stylów są puste. Po prostu nie otrzymuje wartości, bez względu na to, czego spróbuję. Chyba muszę użyć $ _GET, aby uzyskać dostęp do ukrytego pola, które utworzyłem wcześniej. Znowu wszystko, co chcę w tym momencie zrobić, to przekazać tę samą nazwę motywu do szablonu i opcji arkusza stylów, wymyślę, jak je rozróżnić po uruchomieniu.

/**     
 * Create the new site with the theme name
*/
function 70169_wpmu_new_blog( $blog_id ) {

// need to get this working, use $_GET?
//    $theme = ???

    update_blog_option( $blog_id, 'template', $theme );  // $theme works if I hardcode it with a theme name
    update_blog_option( $blog_id, 'stylesheet', $theme );
}

add_action( 'wpmu_new_blog', '70169_wpmu_new_blog' );
Andrzej
źródło
1
Myślę, że to dobre pytanie, +1
Anh Tran
1
teoretycznie jest to możliwe poprzez dodanie dodatkowych pól do formularza rejestracyjnego, ale skąd użytkownik wiedziałby, jak wyglądają motywy? podgląd sprawi, że proces rejestracji stanie się nieco bardziej skomplikowany
imho
@ krembo99 fair point. Próbowałem uprościć to pytanie. Zamierzałem użyć pól radiowych z podglądem miniatur lub mieć przycisk na każdej stronie motywu z napisem „zarejestruj się w tym temacie”. Przycisk po prostu przekaże nazwę nazwy motywu do formularza rejestracji. Myślałem, że zacznę od prostego :)
Andrew
1
ok - w takim razie, jeśli naprawdę chcesz to zrobić, zobacz moją odpowiedź ..
krembo99

Odpowiedzi:

5

Aby zrobić, co chcesz, możesz dodać dowolne pola, a następnie przechowywać je w user_meta...

(Można również przechowywać je w $user_infotablicy / obiekcie, ale nie jestem pewien, jaka byłaby korzyść ..)

  // Render Form Fields
add_action('register_form','k99_register_form_add_theme_field');
// Checking
add_action('register_post','k99_check_fields',10,3);
// Insert Data
add_action('user_register', 'k99_register_new_register_fields');

// Render the form with the additional radio field 
function k99_register_form_add_theme_field(){
?>

<p>
<label>Theme<br />
 <?php $themes=wp_get_themes();
foreach ($themes as $theme ) {
$theme['Name'] = sanitize_title_with_dashes($theme['Name']);
$checked = checked( $_POST['custom_theme'], 1 );
 echo '<input id="custom_theme'.$theme['Name'] .'" type="radio" name="custom_theme" value="'. $theme['Name'] .'" '.$checked.'>  '. $theme['Name'].'<br />';
$custom_theme = $_POST['custom_theme'];
} ?>
</label>
</p>

<?php
}

// checking , sanitation etc .. of course this is not done...

function k99_check_fields($login, $email, $errors) {
global $custom_theme;
if ($_POST['custom_theme'] == '') {
$errors->add('empty_theme', "<strong>Error:</strong> Please select theme.");
}
else {
$custom_theme = $_POST['custom_theme'];
}
}

// Write to DB ... if you will..
function k99_register_new_register_fields($user_id, $password="", $meta=array())  {

$custom_theme = $_POST['custom_theme']; //just in case ..
update_usermeta($user_id, 'user_custom_theme',$custom_theme);

}

po tym wszystkim możesz pobrać user_theme w następujący sposób:

get_user_meta($user_id, 'user_custom_theme', true);

UWAGA: To zostało napisane w locie. Nie zostało to zweryfikowane na wielu blogach, ale na prostej instalacji wp, i chociaż nie powinno być dużej różnicy - wciąż nie jest to funkcja produkcyjna, tylko po to, aby wprowadzić właściwą ścieżkę. Potrzebne są warunki sanitarne i sprawdzanie zmiennych, kod czyszczenia i FORMALNY ZNAK, a także dodawanie pola również do innych ekranów powiązanych z użytkownikiem (tworzenie użytkownika, edycja użytkownika, edycja profilu itp.).

UWAGA II: pytałeś o formy grawitacyjne w twoim uodate - mają do tego dodatek

krembo99
źródło
dzięki za pomoc. Udało mi się coś poskładać i prawie to działa. Po prostu problem z przyklejeniem się ukrytego pola i przekazaniem wartości do ostatniej funkcji. Zaktualizowałem moje pytanie, aby uwzględnić dotychczasowe postępy.
Andrew,
próbowałeś mojej funkcji? powinno działać ..
krembo99,
Hak register_form w twoim przykładzie nie będzie działał w wielu miejscach. Znaleziono kolejny hak, do którego można dodać przyciski opcji. Również get_themes () jest przestarzałe i znalazłem lepszy sposób na uzyskanie informacji o motywie. Wreszcie nie sądzę, aby dodanie nazwy motywu do meta-tabeli użytkownika było najlepszym sposobem, motywu templatei stylesheetsą przechowywane w tabeli opcji. Mówiąc to, twój kod był do tej pory ogromną pomocą, dzięki.
Andrew,
hook register_form będzie działał na wielu stronach (patrz CODEX codex.wordpress.org/Plugin_API/Action_Reference/register_form ). można znaleźć wiele innych haczyków, ale to byłoby właściwe, aby użyć IMHO .. o innych komentarzach, naprawdę nie rozumiem sensu, chcesz wyjaśnić?
krembo99
Dziękujemy za uwagę na formularzu rejestracyjnym użytkownika grawitacji. Mam już tę wtyczkę, ale nie pozwala ona wybrać motywu, gdy użytkownik rejestruje się w witrynie, stąd moje pytanie.
Andrew
1

Wiem, że to rodzaj oszustwa, ale używam tej wtyczki. Pozwala skopiować dowolną istniejącą witrynę sieciową, a następnie udostępnia ją jako szablon podczas rejestracji nowych użytkowników. Możesz utworzyć dowolną liczbę nowych szablonów blogów. Będą one zawierać całą zawartość, wtyczki, ustawienia itp. Itp., A użytkownicy mogą wybrać jedną podczas konfigurowania nowej witryny / konta :)

http://premium.wpmudev.org/project/new-blog-template/

speedypancake
źródło
0

Ten rodzaj odpowiedzi na twoje pytanie: umieściliśmy wtyczkę o nazwie „ Zmiana motywu ” na tej stronie: focusww.com i umieściłem pasek boczny, na którym możesz wybierać z listy motywów. Pozwala wybrać motywy, które mogą być używane, i czas, po upływie którego plik cookie wygasa, aby powrócić do domyślnego motywu.

Nohl
źródło
Przepraszam, nie jestem po „przełączaniu motywów”. Chciałbym, aby użytkownik mógł wybrać motyw, gdy rejestruje się w blogu przy użyciu wp-signup.php w instalacji wielostanowiskowej.
Andrew
Właśnie natknąłem się na wtyczkę za 19 USD, która pozwala użytkownikom zainstalować motyw przy rejestracji: premium.wpmudev.org/project/new-blog-template <= sprawdź :)
Nohl
0

Jeśli nadal jest to istotne, być może może to pomóc innym szukającym podobnych rozwiązań

/**
 * Add custom field to registration form
 */
add_action( 'signup_blogform', 'aoc_show_addtional_fields' );
add_action( 'user_register', 'aoc_register_extra_fields' );

function aoc_show_addtional_fields() 
{
    $themes = wp_get_themes();
    echo '<label>Choose template for your site';
    foreach ($themes as $theme){
        echo '<img src="'.$theme->get_screenshot().'" width="240"/>';
        echo $theme->name . ' <input id="template" type="radio" tabindex="30" size="25" value="'.$theme->template.'" name="template" />';
    }
    echo '</label>';
}

function aoc_register_extra_fields ( $user_id, $password = "", $meta = array() ) {
    update_user_meta( $user_id, 'template', $_POST['template'] );
}

// The value submitted in our custom input field needs to be added to meta array as the user might not be created yet.
add_filter('add_signup_meta', 'aoc_append_extra_field_as_meta');
function aoc_append_extra_field_as_meta($meta) 
{
    if(isset($_REQUEST['template'])) {
        $meta['template'] = $_REQUEST['template'];
    }
    return $meta;
}

// Once the new site added by registered user is created and activated by user after email verification, update the template selected by user in database.
add_action('wpmu_new_blog', 'aoc_extra_field', 10, 6);
function aoc_extra_field($blog_id, $user_id, $domain, $path, $site_id, $meta) 
{
    update_blog_option($blog_id, 'template', $meta['template']);
    update_blog_option($blog_id, 'stylesheet', $meta['template']);
}

Napisałem tutaj wpis na blogu ( http://artofcoding.in/select-theme-while-registering-wordpress-multisite-network/ ), gdy miałem podobne wymagania. Mam nadzieję, że to jest pomocne.

ankittiwaari
źródło