Permitir que o usuário selecione um tema para instalar quando se inscrever

11

É possível permitir que um usuário selecione qual tema gostaria de instalar na nova página de inscrição do site? E assim que o site é criado, ele obviamente instala o tema escolhido.

Eu encontrei wp_get_themes . É assim que você faria para preencher previamente um menu suspenso com todos os temas disponíveis? Como você passa as informações do tema para o processo de inscrição real para que o site seja criado com o tema correto?

Se alguém souber como fazer isso com o Gravity Forms, isso também seria ótimo.

Atualização:

Aqui está o que eu tenho até agora, não leva em conta temas infantis, vai trabalhar nisso depois

Esta função produzirá uma lista de temas com botões de opção, armazenando o tema selecionado em $ _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' );

Eu pensei em adicionar um campo oculto como forma de passar o valor do tema para a criação do site. Há algo errado com isso - no último passo, ele perde o valor, não tenho certeza do porquê ainda.

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

E finalmente uma função para passar o nome do tema para o site recém-criado. Isso funciona se eu codificar as variáveis, mas não consigo passar o valor do custom_theme ainda. O site é criado bem, mas as opções de modelo e folha de estilo estão em branco. Só não está recebendo o valor, não importa o que eu tente. Eu acho que tenho que usar $ _GET para acessar o campo oculto que eu criei anteriormente. Mais uma vez, tudo o que quero fazer neste momento é passar o mesmo nome de tema para as opções de modelo e folha de estilo, vou descobrir como diferenciá-los depois que eu começar a trabalhar.

/**     
 * 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' );
    
por Andrew 23.10.2012 / 12:15

4 respostas

5

Para fazer o que você deseja, você pode adicionar os campos que quiser e, em seguida, armazená-los no user_meta ...

(Também é possível armazená-los no $user_info array / object, mas não tenho certeza qual seria o benefício ..)

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

}

depois de tudo isso, você pode recuperar o user_theme assim:

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

NOTA: Isto foi escrito On-The-Fly. Não foi verificado em multi-blog, mas em uma instalação wp simples, e embora não deva haver muita diferença - ainda assim esta não é uma função de produção, foi apenas para colocá-lo no caminho certo. Saneamento e verificação de variáveis, código de limpeza e FORM MARKUP são necessários, bem como adicionar o campo também a outras telas relacionadas ao usuário (criar usuário, editar usuário, editar perfil, etc.).

OBSERVAÇÃO II: você perguntou sobre formas de gravidade em seu uodate - eles têm um add-on para isso

    
por krembo99 27.10.2012 / 11:23
1

Eu sei que isso é uma espécie de trapaça, mas eu uso esse plugin. Ele permite que você copie qualquer site de rede existente e, em seguida, o disponibiliza como um modelo quando novos usuários se inscrevem. Você pode criar quantos novos modelos de blog desejar. Eles conterão todo o conteúdo, plugins, configuração etc etc e os usuários podem escolher um ao configurar um novo site / conta:)

enlace

    
por speedypancake 27.10.2012 / 11:47
0

Esse tipo de resposta responde à sua pergunta: Colocamos um plugin chamado ' Mudança de Tema ' neste site: focusww.com e ele coloca uma barra lateral onde você pode escolher uma lista de temas. Ele permite escolher quais temas podem ser usados e quanto tempo antes que o cookie expire para reverter para um tema padrão.

    
por Nohl 26.10.2012 / 07:04
0

Se ainda relevante, talvez isso poderia ajudar outros à procura de soluções semelhantes

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

Eu escrevi uma postagem no blog ( enlace ) aqui quando tive uma exigência similar. Espero que isso seja útil.

    
por ankittiwaari 22.11.2018 / 08:24