Altera qual sidebar get_sidebar () obtém de functions.php

2

Eu tenho este código em um arquivo de modelo, que carrega sidebar-sidebar_a.php :

get_sidebar('sidebar_a');

Eu gostaria de adicionar uma função ao sidebar.php que tem o efeito de mudar isso para isso se alguma condição for satisfeita:

get_sidebar('other');

para que, em vez disso, carregue sidebar-other.php .

Eu achei que isso funcionaria, mas parece não ter efeito:

add_action('get_sidebar', 'my_sidebar_logic');

function my_sidebar_logic($sidebar) {
    // Load a different sidebar if the user is logged in
    if (is_user_logged_in()) {
        return 'other';
    }

    return $sidebar;
}

O que posso fazer para obter o efeito que quero?

    
por supertrue 07.09.2012 / 18:40

4 respostas

6

A barra lateral Obter é um empacotador muito fino em torno de locate_template , que apenas pesquisa o tema filho atual e o diretório do tema pai para a barra lateral fornecida.

get_sidebar em wp-includes/general-template.php :

$templates = array();
if ( isset($name) )
    $templates[] = "sidebar-{$name}.php";

$templates[] = 'sidebar.php';

// Backward compat code will be removed in a future release
if ('' == locate_template($templates, true))
    load_template( ABSPATH . WPINC . '/theme-compat/sidebar.php');

}

E locate_template (em wp-includes/template.php ):

<?php
/**
 * Retrieve the name of the highest priority template file that exists.
 *
 * Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which
 * inherit from a parent theme can just overload one file.
 *
 * @since 2.7.0
 *
 * @param string|array $template_names Template file(s) to search for, in order.
 * @param bool $load If true the template file will be loaded if it is found.
 * @param bool $require_once Whether to require_once or require. Default true. Has no effect if $load is false.
 * @return string The template filename if one is located.
 */
function locate_template($template_names, $load = false, $require_once = true ) {
    $located = '';
    foreach ( (array) $template_names as $template_name ) {
        if ( !$template_name )
            continue;
        if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
            $located = STYLESHEETPATH . '/' . $template_name;
            break;
        } else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
            $located = TEMPLATEPATH . '/' . $template_name;
            break;
        }
    }

    if ( $load && '' != $located )
        load_template( $located, $require_once );

    return $located;
}

A razão pela qual o gancho em get_sidebar não funciona é porque é uma ação. Apenas atira. Não permite que você mude o resultado. Sua barra lateral ainda será incluída, independentemente da sua ação viciada.

Isso eleva algumas opções para você.

1. Passar uma variável para get_sidebar

Solução da Chip Bennett: passe uma variável para a função get_sidebar . Nada mal.

2. Escreva sua própria lógica da barra lateral

E use-o no lugar de get_sidebar . Um exemplo simples:

<?php
function mytheme_sidebar($name)
{
     $name = apply_filters('mytheme_sidebar', $name);
     get_sidebar($name);
}

Use seu próprio filtro para modificar a barra lateral

<?php
add_filter('mytheme_sidebar', 'mytheme_custom_sidebar');
function mytheme_custom_sidebar($name)
{
    return is_user_logged_in() ? 'loggedin' : $name;
}

Isso será o mais flexível. Se for um tema público, os usuários finais poderão personalizar as coisas. Se for para um cliente, quando inevitavelmente pedir mais coisas, é fácil.

3. Procure mais

get_sidebar inclui apenas os arquivos de tema apropriados. dynamic_sidebar é onde o trabalho é feito.

Se você der uma olhada nessa função, a linha mais interessante é:

$sidebars_widgets = wp_get_sidebars_widgets();

wp_get_sidebars_widgets busca todos os widgets registrados no momento para todas as barras laterais no site.

<?php
/**
 * Retrieve full list of sidebars and their widgets.
 *
 * Will upgrade sidebar widget list, if needed. Will also save updated list, if
 * needed.
 *
 * @since 2.2.0
 * @access private
 *
 * @param bool $deprecated Not used (deprecated).
 * @return array Upgraded list of widgets to version 3 array format when called from the admin.
 */
function wp_get_sidebars_widgets($deprecated = true) {
    if ( $deprecated !== true )
        _deprecated_argument( __FUNCTION__, '2.8.1' );

    global $wp_registered_widgets, $_wp_sidebars_widgets, $sidebars_widgets;

    // If loading from front page, consult $_wp_sidebars_widgets rather than options
    // to see if wp_convert_widget_settings() has made manipulations in memory.
    if ( !is_admin() ) {
        if ( empty($_wp_sidebars_widgets) )
            $_wp_sidebars_widgets = get_option('sidebars_widgets', array());

        $sidebars_widgets = $_wp_sidebars_widgets;
    } else {
        $sidebars_widgets = get_option('sidebars_widgets', array());
    }

    if ( is_array( $sidebars_widgets ) && isset($sidebars_widgets['array_version']) )
        unset($sidebars_widgets['array_version']);

    $sidebars_widgets = apply_filters('sidebars_widgets', $sidebars_widgets);
    return $sidebars_widgets;
}

A linha chave lá: apply_filters('sidebars_widget', ...) . Dinheiro.

Registre uma barra lateral secundária somente para usuários conectados:

<?php
add_action('widgets_init', 'wpse64492_register');
function wpse64492_register()
{
    register_sidebar(array(
        'name'  => __('Logged In Sidebar', 'wpse64492'),
        'id'    => 'logged-in'
    ));
}

Em seguida, conecte em sidebars_widgets e troque a barra lateral normal pela versão conectada.

<?php
add_filter('sidebars_widgets', 'wpse64492_switch');
function wpse64492_switch($widgets)
{
    if(is_admin())
        return $widgets;

    $key = 'sidebar-1'; // the sidebar you want to change!

    if(isset($widgets[$key]) && is_user_logged_in() && isset($widgets['logged-in']))
        $widgets[$key] = $widgets['logged-in'];

    return $widgets;
}
    
por chrisguitarguy 07.09.2012 / 20:39
3

Apenas passe uma variável para get_sidebar() :

// Determine sidebar
$sidebar = ( is_user_logged_in() ? 'other' : 'sidebar_a' );
// Get the sidebar
get_sidebar( $sidebar );
    
por Chip Bennett 07.09.2012 / 18:49
1

Temas

Basta envolvê-lo na lógica mais fina e menos intrusiva: um filtro.

// In you theme: Calls the default sidebar
get_sidebar( apply_filters( 'wpse64492_sidebar', '' ) );

Então você pode mudar seu arquivo functions.php:

function wpse64492_sidebar_name( $name = '' )
{
    // Call sidebar-single.php on single view posts
    is_single() AND $name = 'single';

    return $name;
}
add_filter( 'wpse64492_sidebar', 'wpse64492_sidebar_name' );

Plugins

Se você quiser fazer isso usando um plug-in, use a ação:

<?php
/** Plugin Name: (#64492) Switch sidebars per request */
function wpse64492_sidebar( $name )
{
    // Conditional logic: Some other sidebar for page 2+ on paged archives
    if ( is_paged() )
    {
        // Avoid recurrsion: remove itself
        remove_filter( current_filter(), __FUNCTION__ );
        return get_sidebar( 'paged' );
    }

    // Default return
    return $name;
}
add_action( 'get_sidebar', 'wpse64492_sidebar' );
    
por kaiser 17.10.2012 / 05:23
0

Você também pode chamar a barra lateral real na função.

add_action('get_sidebar', 'my_sidebar_logic');

function my_sidebar_logic($sidebar) {
    // Load a different sidebar if the user is logged in
    if (is_user_logged_in()) {
          get_sidebar('other');
    }   
}
    
por Wyck 07.09.2012 / 18:50