Flush_rewrite_rules não funciona quando as configurações são atualizadas

4

Eu adicionei algumas opções personalizadas ao meu WordPress CMS na página de administração do Reading. Eu estou usando essas opções para definir algumas páginas adicionais que eu vinculei a operações personalizadas. Esse método permite que eu não mantenha um arquivo de constantes com vários IDs de página codificados e concede ao usuário final mais flexibilidade sobre quais páginas executam essas funções.

Quando essas opções mudam, preciso liberar os links permanentes para que as referências a essas páginas sejam atualizadas e os links permanentes em todo o site funcionem corretamente.

Escrevi o seguinte na tentativa de fazer isso:

function qd_flush_rules() { 
   flush_rewrite_rules(); 
} 
add_action('update_option_qd_news_page', 'qd_flush_rules');

qd_news_page é o nome da opção que criei e posso confirmar que essa configuração foi criada corretamente e funcionando. Também tenho certeza que essa função está disparando depois que os dados são salvos, porque qualquer eco que eu coloque na função qd_flush_rules produz o valor da configuração corretamente.

Independentemente disso, as regras de reescrita não são liberadas e meus permalinks estão retornando 404. Se eu atualizar os permalinks na página de administração do WordPress Permalinks, tudo funcionará imediatamente.

código completo:

function qd_settings_api_init() {
  add_settings_section(
    'qd_theme_setting_section',
    'Theme Reading Settings',
    'qd_theme_setting_section_callback_function',
    'reading'
  );

  add_settings_field(
    'qd_news_page',
    'News Page',
    'qd_news_page_dropdown_cbf',
    'reading',
    'qd_theme_setting_section'
  );
  register_setting( 'reading', 'qd_news_page' );

}

add_action( 'admin_init', 'qd_settings_api_init' );

//FLUSH THE PERMALINKS WHEN THIS OPTION IS SAVED
function qd_flush_rules() { 
  flush_rewrite_rules(); 
  echo "News Page updated - " . get_option('qd_news_page');
} 

add_action('update_option_qd_news_page', 'qd_flush_rules');

function qd_theme_setting_section_callback_function() {
    echo "<p>Setting Instructions</p>";
}

function qd_news_page_dropdown_cbf() {
  $args = array(
    'depth'                 => 0,
    'child_of'              => 0,
    'selected'              => get_option( 'qd_news_page' ),
    'echo'                  => 1,
    'name'                  => 'qd_news_page',
    'id'                    => 'qd_news_page', // string
    'show_option_none'      => '&mdash; Select &mdash;', // string
    'show_option_no_change' => null, // string
    'option_none_value'     => '0', // string
  );
  wp_dropdown_pages( $args );
} 

atualização 12/8/15 11:24 am est

Deseja esclarecer que as configurações personalizadas não estão criando diretamente a estrutura de permalink, mas estão sendo usadas por tipos de postagem personalizados para atribuir suas regras de regravação.

Um trecho deste código está abaixo:

function qd_custom_post_types() { 
    $post_type_slug = "/" .  get_page_uri( get_option('qd_news_page') );

    register_post_type( 'qd_news', 
        array( 'labels' => array(
            ...
            'rewrite'   => array( 'slug' => $post_type_slug . '/article', 'with_front' => false ),
            ...
        )
    );  
}
add_action( 'init', 'qd_custom_post_types');'
    
por Eric K 02.12.2015 / 23:57

1 resposta

3

Isso funciona para você? Parece funcionar quando eu tento.

  function qd_settings_api_init() {
  add_settings_section(
    'qd_theme_setting_section',
    'Theme Reading Settings',
    'qd_theme_setting_section_callback_function',
    'reading'
  );

  add_settings_field(
    'qd_news_page',
    'News Page',
    'qd_news_page_dropdown_cbf',
    'reading',
    'qd_theme_setting_section'
  );
  if (delete_transient('qd_flush_rules')) flush_rewrite_rules(); // * Added
  register_setting( 'reading', 'qd_news_page', 'qd_sanitize' ); // * Changed

}

/* Added this function. */
function qd_sanitize($input) {
    set_transient('qd_flush_rules');
    return $input;
}

add_action( 'admin_init', 'qd_settings_api_init' );

//FLUSH THE PERMALINKS WHEN THIS OPTION IS SAVED
function qd_flush_rules() { 
  flush_rewrite_rules(); 
  echo "News Page updated - " . get_option('qd_news_page');
} 

add_action('update_option_qd_news_page', 'qd_flush_rules');

function qd_theme_setting_section_callback_function() {
    echo "<p>Setting Instructions</p>";
}

function qd_news_page_dropdown_cbf() {
  $args = array(
    'depth'                 => 0,
    'child_of'              => 0,
    'selected'              => get_option( 'qd_news_page' ),
    'echo'                  => 1,
    'name'                  => 'qd_news_page',
    'id'                    => 'qd_news_page', // string
    'show_option_none'      => '&mdash; Select &mdash;', // string
    'show_option_no_change' => null, // string
    'option_none_value'     => '0', // string
  );
  wp_dropdown_pages( $args );
} 

//

function qd_custom_post_types() { 
    $post_type_slug = "/" .  get_page_uri( get_option('qd_news_page') );

    register_post_type( 'qd_news', 
        array(
            'labels' => array(
            'name' => __( 'Articles' ),
            'singular_name' => __( 'Article' )
        ),
        'public' => true,
        'has_archive' => true,
        'rewrite'   => array( 'slug' => $post_type_slug . '/article', 'with_front' => false ),
    )
  );
}
add_action( 'init', 'qd_custom_post_types');
    
por Megan 11.12.2015 / 16:21