web-dev-qa-db-fra.com

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

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 de son choix.

J'ai trouvé wp_get_themes . Est-ce que c'est comme cela que vous voudriez pré-remplir un menu déroulant avec tous les thèmes disponibles? Comment passez-vous les informations du thème au processus d'inscription actuel pour que le site soit créé avec le bon thème?

Si quelqu'un sait comment faire cela avec Gravity Forms, ce serait formidable également.

Update:

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

Cette fonction produira 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' );

Je pensais ajouter un champ caché afin de transmettre la valeur du thème à la création du site. Il y a cependant quelque chose qui ne va pas avec cela - à 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 transmettre le nom du thème au site nouvellement créé. Cela fonctionne si je code les variables en dur, mais je ne parviens pas encore à transmettre la valeur de custom_theme. Le site est bien créé, mais les options de modèle et de feuille de style sont vides. Ce n'est tout simplement pas obtenir la valeur, peu importe ce que j'essaie. Je suppose que je dois utiliser $ _GET pour accéder au champ masqué que j'ai créé précédemment. 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 trouver comment les différencier une fois que tout fonctionne.

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

Afin de faire ce que vous voulez, vous pouvez ajouter les champs de votre choix, puis les stocker dans le user_meta ...

(On pourrait aussi les stocker dans le tableau/objet $user_info, mais je ne suis pas sûr de savoir 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, vous pouvez récupérer le user_theme comme ceci:

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

NOTE: Ceci a été écrit à la volée. Cela n'a pas été vérifié sur plusieurs blogs, mais sur une installation simple de wp, et bien qu'il ne devrait pas y avoir beaucoup de différence - ce n'est pas une fonction de production, c'était uniquement pour vous mettre sur la bonne voie. La désinfection et la vérification des variables, le code de nettoyage et FORM MARKUP sont nécessaires, ainsi que l'ajout du champ à 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 ajout pour cela

5
krembo99

Je sais que c'est une sorte de tricherie, mais j'utilise ce plugin. Il vous permet de copier tout site réseau existant, puis de le rendre disponible en tant que modèle lors de l'inscription de nouveaux utilisateurs. 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., 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/

1
speedypancake

Ce type de réponse à votre question: nous avons mis un plugin appelé ' Theme Switch ' sur ce site: focusww.com et une barre latérale où vous pouvez choisir parmi une liste de thèmes. Il vous permet de choisir les thèmes à utiliser et combien de temps avant l’expiration du cookie pour revenir à un thème par défaut.

0
Nohl

Si toujours pertinent, cela pourrait peut-être aider les autres à 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 lorsque j'avais une exigence similaire. J'espère que c'est utile.

0
ankittiwaari