Permitir al usuario seleccionar un tema para instalar cuando se registra

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 instala el tema que elijan.

Encontré wp_get_themes . ¿Es así como se debe completar previamente un menú desplegable con todos los temas disponibles? ¿Cómo 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, también sería genial.

Actualizar:

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

Esta función generará una lista de temas con botones de opción, 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 mal con esto: en el último paso pierde su valor, aún no estoy seguro de por qué.

/**
 * 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 codifico las variables, pero todavía no puedo pasar el valor de 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 punto es pasar el mismo nombre de tema a las opciones de plantilla y hoja de estilo, descubriré cómo diferenciarlas después de que funcione.

/**     
 * 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' );
Andrés
fuente
1
Creo que esta es una buena pregunta, +1
Anh Tran
1
teóricamente es posible agregando campos adicionales al formulario de registro, pero ¿cómo sabría el usuario cómo se ven los temas? la vista previa hará que el proceso de registro sea un poco más complicado ...
krembo99
@ krembo99 punto justo. Traté de simplificarlo para la pregunta. Iba a usar campos de radio con vistas previas en miniatura o tenía un botón en cada página de tema que decía "registrarse con este tema". El botón simplemente pasaría el nombre del tema al formulario de registro. Pensé que empezaría a cabo sencilla :)
Andrew
1
ok - en ese caso, si realmente quieres hacerlo, mira mi respuesta ..
krembo99

Respuestas:

5

Para hacer lo que quiera, puede agregar los campos que desee y luego almacenarlos en user_meta...

(Uno también podría almacenarlos en la $user_infomatriz / objeto, 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, puede recuperar el user_theme así:

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

NOTA: Esto fue escrito sobre la marcha. No se verificó en varios blogs, sino en una instalación simple de wp, y aunque no debería haber mucha diferencia, aún no se trata de una función de producción, solo fue para ponerlo en el camino correcto. Se necesita saneamiento y verificación de variables, código de limpieza y FORM MARKUP, además de 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

krembo99
fuente
gracias por tu ayuda. Me las arreglé para armar algo y casi lo tengo funcionando. Solo tengo problemas para que el campo oculto se pegue y pase el valor a la última función. He actualizado mi pregunta para incluir mi progreso hasta ahora.
Andrew
¿Probaste mi función? debería funcionar ..
krembo99
El gancho register_form en su ejemplo no funcionará en varios sitios. Encontré otro gancho para agregar los botones de radio. También get_themes () está en desuso y encontré una mejor manera de obtener la información del tema. Finalmente, no creo que agregar el nombre del tema a la metatabla del usuario sea la mejor manera, los temas templatey stylesheetse almacenan en la tabla de opciones. Al decir eso, su código ha sido de gran ayuda hasta ahora, gracias.
Andrew
el gancho register_form va a trabajar en varios sitios (ver CODEX codex.wordpress.org/Plugin_API/Action_Reference/register_form ). puedes encontrar muchos otros ganchos, pero ese sería el correcto para usar en mi humilde opinión ... sobre los otros comentarios, realmente no entiendo el punto, ¿te importaría explicarlo?
krembo99
Gracias por la nota en el plugin de registro de usuario de formularios de gravedad. Ya tengo ese complemento, pero no le permite seleccionar un tema cuando el usuario se registra en un sitio, de ahí mi pregunta.
Andrew
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 plantilla cuando se registran nuevos usuarios. Puede crear tantas plantillas de blog nuevas como desee. Contendrán todo el contenido, complementos, configuración, etc., y los usuarios pueden elegir uno al configurar un nuevo sitio / cuenta :)

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

speedypancake
fuente
0

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

Nohl
fuente
Lo siento, no estoy después de un "selector de tema". Me gustaría que el usuario pueda seleccionar un tema cuando se registre en un blog usando wp-signup.php en una instalación multisitio.
Andrew
Me encontré con un complemento de $ 19 que permite a los usuarios instalar un tema en el registro: premium.wpmudev.org/project/new-blog-template <= échale un vistazo :)
Nohl
0

Si aún es relevante, tal vez 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 publicación de blog ( http://artofcoding.in/select-theme-while-registering-wordpress-multisite-network/ ) aquí cuando tenía un requisito similar. Espero que esto sea útil.

ankittiwaari
fuente