Permitir que el usuario seleccione un tema para instalar cuando se registre

11

¿Es posible permitir que un usuario seleccione qué tema desea instalar desde la nueva página de registro del sitio? Y una vez que se crea el sitio, obviamente se instala el tema que elijan.

Encontré wp_get_themes . ¿Es así como lo haría antes de rellenar un menú desplegable con todos los temas disponibles? ¿Cómo se pasa la información del tema al proceso de registro real para que el sitio se cree con el tema correcto?

Si alguien sabe cómo hacer esto con Gravity Forms, eso también sería bueno.

Actualizar:

Esto es lo que tengo hasta ahora, no tiene en cuenta los temas secundarios, trabajará en eso después

Esta función generará una lista de temas con botones de radio, almacenando el tema seleccionado en $ _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' );

Pensé que agregaría un campo oculto como una forma de pasar el valor del tema a la creación del sitio. Sin embargo, hay algo malo con esto: en el último paso pierde su valor, no estoy seguro de por qué todavía.

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

Y finalmente, una función para pasar el nombre del tema al sitio recién creado. Esto funciona si realizo un hardcode de las variables, pero aún no puedo pasar el valor del custom_theme. El sitio se crea bien, pero las opciones de plantilla y hoja de estilo están en blanco. Simplemente no está obteniendo el valor no importa lo que intente. Supongo que tengo que usar $ _GET para acceder al campo oculto que creé anteriormente. Una vez más, todo lo que quiero hacer en este momento es pasar el mismo nombre de tema a las opciones de plantilla y hoja de estilo. Descubriré cómo diferenciarlas una vez que las haga 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' );
    
pregunta Andrew 23.10.2012 - 12:15

4 respuestas

5

Para hacer lo que quieres, puedes agregar los campos que quieras y luego almacenarlos en el user_meta ...

(También se podrían almacenar en la matriz / objeto $user_info , pero no estoy seguro de cuál sería el beneficio ...)

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

}

después de todo eso, puedes recuperar el tema de usuario así:

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

NOTA: Esto se escribió On-The-Fly. No se verificó en un blog múltiple, sino en una instalación sencilla de wp, y aunque no debería haber mucha diferencia, aún así esta no es una función de producción, fue solo para ponerlo en el camino correcto. Se requieren el saneamiento y la verificación de variables, el código de limpieza y FORM MARKUP, así como agregar el campo también a otras pantallas relacionadas con el usuario (crear usuario, editar usuario, editar perfil, etc.).

NOTA II: usted preguntó acerca de las formas de gravedad en su uodate - tienen un complemento para eso

    
respondido por el krembo99 27.10.2012 - 11:23
1

Sé que esto es una especie de trampa, pero uso este complemento. Le permite copiar cualquier sitio de red existente y luego lo pone a disposición como una plantilla cuando los nuevos usuarios se registran. Puede crear tantas nuevas plantillas de blog como desee. Contendrán todo el contenido, complementos, configuración, etc., y los usuarios pueden elegir uno al configurar un nuevo sitio / cuenta :)

enlace

    
respondido por el speedypancake 27.10.2012 - 11:47
0

Este tipo de respuestas a tu pregunta: Ponemos un complemento llamado ' Cambio de tema ' en este sitio: focusww.com y ponemos una barra lateral donde puede elegir Una lista de temas. Le permite elegir qué temas pueden usarse y cuánto tiempo antes de que caduque la cookie para volver a un tema predeterminado.

    
respondido por el Nohl 26.10.2012 - 07:04
0

Si aún es relevante, quizás esto podría ayudar a otros que buscan soluciones similares

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

He escrito una entrada de blog ( enlace ) aquí cuando tuve un requisito similar. Espero que esto sea útil.

    
respondido por el ankittiwaari 22.11.2018 - 08:24

Lea otras preguntas en las etiquetas