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' );

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


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/


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.