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

11

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

Encontrei wp_get_themes . É assim que você preencheria 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 sabe como fazer isso com Gravity Forms, isso seria ótimo também.

Atualizar:

Aqui está o que eu tenho até agora, ele não leva em conta os temas filhos, 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 uma maneira de passar o valor do tema para a criação do site. Há algo errado com isso - no último passo, ele perde seu valor, ainda não sei por que.

/**
 * 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 ainda não consigo transmitir o valor do custom_theme. O site foi criado corretamente, mas as opções de modelo e folha de estilo estão em branco. Só não está obtendo o valor, não importa o que eu tente. Acho que tenho que usar $ _GET para acessar o campo oculto que criei anteriormente. Novamente, tudo o que eu quero fazer neste momento é passar o mesmo nome de tema para as opções de modelo e folha de estilo. Descobrirei como diferenciá-los depois de fazê-lo funcionar.

/**     
 * 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
fonte
1
Eu acho que essa é uma boa pergunta, +1
Anh Tran
1
teoricamente, é possível adicionar campos adicionais ao formulário de registro, mas como o usuário saberia a aparência dos temas? de visualização fará com que o processo de registo um pouco mais complicado imho ...
krembo99
@ krembo99 fair point. Eu tentei simplificá-lo para a pergunta. Eu usaria campos de rádio com visualizações em miniatura ou teria um botão em cada página do tema que dizia "inscrição com este tema". O botão simplesmente passaria o nome do nome do tema para o formulário de inscrição. Pensei em começar :) simples
Andrew
1
ok - nesse caso, se você realmente quer fazer isso, consulte minha resposta ..
krembo99

Respostas:

5

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

(Também é possível armazená-los na $user_infomatriz / objeto, 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: Isso foi escrito On-The-Fly. Não foi verificado no multi-blog, mas em uma instalação simples do wp e, embora não deva haver muita diferença - ainda não é uma função de produção, era apenas para colocá-lo no caminho certo. São necessários saneamento e verificação de variáveis, código de limpeza e FORM MARKUP, além de adicionar o campo a outras telas relacionadas ao usuário (criar usuário, editar usuário, editar perfil etc.).

NOTA II: você perguntou sobre as formas de gravidade no seu uodato - elas têm um complemento para isso

krembo99
fonte
Obrigado pela ajuda. Consegui juntar algo e quase fazê-lo funcionar. Apenas tendo problemas para fazer com que o campo oculto permaneça e passe o valor para a última função. Atualizei minha pergunta para incluir meu progresso até o momento.
28412 Andrew
você tentou minha função? ele deve funcionar ..
krembo99
O gancho register_form no seu exemplo não funcionará em vários sites. Encontrou outro gancho para adicionar os botões de opção. Também get_themes () está obsoleto e eu achei uma maneira melhor de obter as informações do tema. Finalmente, não acho que adicionar o nome do tema à meta tabela do usuário seja a melhor maneira, o tema templatee stylesheetseja armazenado na tabela de opções. Ao dizer isso, seu código tem sido uma tremenda ajuda até agora, obrigado.
28412 Andrew
o gancho register_form vai trabalhar em vários locais (ver CODEX codex.wordpress.org/Plugin_API/Action_Reference/register_form ). você pode encontrar muitos outros ganchos, mas esse seria o caminho certo para usar o IMHO .. sobre os outros comentários, eu realmente não entendo o ponto, gostaria de explicar?
krembo99
Obrigado pela observação no plug-in de registro de usuário de formulários de gravidade. Eu já tenho esse plugin, mas ele não permite que você selecione um tema quando o usuário se registra em um site, daí a minha pergunta.
Andrew
1

Eu sei que isso é meio trapaça, mas eu uso esse plugin. Ele permite copiar qualquer site de rede existente e o disponibiliza como 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ções, etc, etc, e os usuários poderão escolher um ao configurar um novo site / conta :)

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

speedypancake
fonte
0

Esse tipo de resposta à sua pergunta: colocamos um plugin chamado ' Theme Switch ' neste site: focusww.com e uma barra lateral na qual você pode escolher uma lista de temas. Permite escolher quais temas podem ser usados ​​e quanto tempo antes que o cookie expire para reverter para um tema padrão.

Nohl
fonte
Desculpe, não estou atrás de um "alternador de temas". Gostaria que o usuário pudesse selecionar um tema ao se inscrever em um blog usando o wp-signup.php em uma instalação multisite.
26412 Andrew
Eu só tropeçou em um plug-in $ 19 que permite aos usuários instalar um tema sobre o registo: premium.wpmudev.org/project/new-blog-template <= confira :)
Nohl
0

Se ainda for relevante, talvez isso possa ajudar outras pessoas a procurar 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 ( http://artofcoding.in/select-theme- while-registering-wordpress-multisite-network/ ) aqui quando eu tinha um requisito semelhante. Espero que isso seja útil.

ankittiwaari
fonte