Autoriser l'utilisateur à sélectionner un thème à installer lors de son inscription

11

Est-il possible d'autoriser un utilisateur à sélectionner le thème qu'il souhaite installer à partir de la nouvelle page d'inscription au site? Et une fois le site créé, il installe évidemment le thème choisi.

J'ai trouvé wp_get_themes . Est-ce ainsi que vous procéderiez pour préremplir un menu déroulant avec tous les thèmes disponibles? Comment passez-vous les informations du thème au processus d'inscription réel pour que le site soit créé avec le thème correct?

Si quelqu'un sait comment faire cela avec Gravity Forms, ce serait bien aussi.

Mise à jour:

Voici ce que j'ai jusqu'à présent, il ne prend pas en compte les thèmes enfants, fonctionnera après

Cette fonction affichera une liste de thèmes avec des boutons radio, stockant le thème sélectionné dans $ _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' );

J'ai pensé ajouter un champ caché comme moyen de transmettre la valeur du thème à la création du site. Cependant, il y a quelque chose qui ne va pas - à la dernière étape, il perd sa valeur, je ne sais pas encore pourquoi.

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

Et enfin une fonction pour passer le nom du thème au site nouvellement créé. Cela fonctionne si je code en dur les variables, mais je ne suis pas encore en mesure de transmettre la valeur de custom_theme. Le site est bien créé mais les options de modèle et de feuille de style sont vides. Il n'obtient simplement pas la valeur, peu importe ce que j'essaie. Je suppose que je dois utiliser $ _GET pour accéder au champ caché que j'ai créé plus tôt. Encore une fois, tout ce que je veux faire à ce stade est de passer le même nom de thème aux options de modèle et de feuille de style, je vais comprendre comment les différencier après l'avoir fait fonctionner.

/**     
 * 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' );
Andrew
la source
1
Je pense que c'est une bonne question, +1
Anh Tran
1
théoriquement, cela est possible en ajoutant des champs supplémentaires au formulaire d'inscription, mais comment l'utilisateur pourrait-il savoir à quoi ressemblent les thèmes? l'aperçu rendra le processus d'inscription un peu plus compliqué à mon humble avis
krembo99
@ krembo99 juste point. J'ai essayé de le simplifier pour la question. J'allais utiliser des champs radio avec des aperçus miniatures ou avoir un bouton sur chaque page de thème qui disait "s'inscrire avec ce thème". Le bouton transmettrait simplement le nom du thème au formulaire d'inscription. Je pensais commencer simplement :)
Andrew
1
ok - dans ce cas, si vous voulez vraiment le faire, voyez ma réponse ..
krembo99

Réponses:

5

Pour faire ce que vous voulez, vous pouvez ajouter les champs que vous voulez, puis les stocker dans le user_meta...

(On pourrait également les stocker dans le $user_infotableau / objet, mais je ne sais pas quel serait l'avantage ..)

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

}

après tout cela, vous pouvez récupérer le user_theme comme ceci:

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

REMARQUE: Ceci a été écrit à la volée. Cela n'a pas été vérifié sur plusieurs blogs, mais sur une simple installation wp, et bien qu'il ne devrait pas y avoir beaucoup de différence - ce n'est toujours pas une fonction de production, c'était seulement pour vous mettre sur la bonne voie. L'assainissement et la vérification des variables, le code de nettoyage et le FORMULAIRE DE MARQUAGE sont nécessaires, ainsi que l'ajout du champ également à d'autres écrans liés à l'utilisateur (créer un utilisateur, modifier un utilisateur, modifier un profil, etc.).

NOTE II: vous avez posé des questions sur les formes de gravité dans votre uodate - ils ont un add-on pour cela

krembo99
la source
Merci de votre aide. J'ai réussi à reconstituer quelque chose et presque à le faire fonctionner. J'ai juste du mal à faire coller le champ caché et à transmettre la valeur à la dernière fonction. J'ai mis à jour ma question pour inclure mes progrès jusqu'à présent.
Andrew
avez-vous essayé ma fonction? ça devrait marcher ..
krembo99
Le hook register_form dans votre exemple ne fonctionnera pas en multisite. Trouvé un autre crochet auquel ajouter les boutons radio. Get_themes () est également obsolète et j'ai trouvé un meilleur moyen d'obtenir les informations sur le thème. Enfin, je ne pense pas que l'ajout du nom du thème à la méta-table de l'utilisateur soit la meilleure façon, les thèmes templateet stylesheetsont stockés dans la table des options. En disant cela, votre code a été d'une grande aide jusqu'à présent, merci.
Andrew
le crochet register_form va travailler sur multisite (voir CODEX codex.wordpress.org/Plugin_API/Action_Reference/register_form ). vous pouvez trouver de nombreux autres crochets, mais ce serait le bon pour utiliser IMHO .. sur les autres commentaires, je ne comprends pas vraiment le point, soin d'expliquer?
krembo99
Merci pour la note sur le plugin d'enregistrement des utilisateurs gravity forms. J'ai déjà ce plugin mais il ne vous permet pas de sélectionner un thème lorsque l'utilisateur s'inscrit sur un site, d'où ma question.
Andrew
1

Je sais que c'est une sorte de tricherie, mais j'utilise ce plugin. Il vous permet de copier n'importe quel site réseau existant, puis le rend disponible en tant que modèle lorsque de nouveaux utilisateurs s'inscrivent. Vous pouvez créer autant de nouveaux modèles de blog que vous le souhaitez. Ils contiendront tout le contenu, les plugins, les paramètres, etc., etc. et les utilisateurs peuvent en choisir un lors de la création d'un nouveau site / compte :)

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

speedypancake
la source
0

Ce type de réponse à votre question: Nous avons mis un plugin appelé « Theme Switch » sur ce site: focusww.com et il a mis une barre latérale où vous pouvez choisir parmi une liste de thèmes. Il vous permet de choisir quels thèmes peuvent être utilisés et combien de temps avant l'expiration du cookie pour revenir à un thème par défaut.

Nohl
la source
Désolé, je ne recherche pas un "sélecteur de thème". J'aimerais que l'utilisateur puisse sélectionner un thème lorsqu'il s'inscrit à un blog en utilisant wp-signup.php dans une installation multisite.
Andrew
Je suis juste tombé sur un plugin de 19 $ qui permet aux utilisateurs d'installer un thème lors de l'inscription: premium.wpmudev.org/project/new-blog-template <= check it out :)
Nohl
0

Si cela reste pertinent, cela pourrait peut-être aider d'autres personnes à la recherche de solutions similaires

/**
 * 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']);
}

J'ai écrit un article de blog ( http://artofcoding.in/select-theme- while-registering-wordpress-multisite-network/ ) ici quand j'avais une exigence similaire. J'espère que cela vous sera utile.

ankittiwaari
la source