J'écris un plugin de supplément pour Wordpress Mobile Pack car je voudrais utiliser le thème par défaut sur les pages auxquelles un certain modèle de page a été attribué. Mon plugin ne traitera que de la partie commutateur mobile de ce plugin, donc les autres composants peuvent être ignorés (je pense).
En regardant la source pour wpmp_switcher.php
, tous les appels add_action
et add_filter
pertinents ne sont pas dans une fonction - ils sont exécutés lorsque le fichier est inclus de la manière suivante:
add_action('init', 'wpmp_switcher_init');
add_action('admin_menu', 'wpmp_switcher_admin_menu');
add_action('wp_footer', 'wpmp_switcher_wp_footer');
add_filter('stylesheet', 'wpmp_switcher_stylesheet');
add_filter('template', 'wpmp_switcher_template');
add_filter('option_home', 'wpmp_switcher_option_home_siteurl');
add_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl');
J'ai supprimé les actions/filtres associés à ce qui incite le plugin WPMP à cocher en utilisant le hook plugins_loaded
:
function remove_all_wpmp_switchers() {
remove_action('init', 'wpmp_switcher_init');
remove_action('admin_menu', 'wpmp_switcher_admin_menu');
remove_action('wp_footer', 'wpmp_switcher_wp_footer');
remove_filter('stylesheet', 'wpmp_switcher_stylesheet');
remove_filter('template', 'wpmp_switcher_template');
remove_filter('option_home', 'wpmp_switcher_option_home_siteurl');
remove_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl');
}
add_action('plugins_loaded', 'remove_all_wpmp_switchers');
Jusqu'ici tout va bien.
Maintenant, j'aimerais utiliser le code suivant pour rajouter les actions/filtres lorsque mon modèle n'est pas utilisé:
function wpmp_switcher_exclusions_init(WP_Query $wp_query) {
$template_file_name = get_post_meta($wp_query->get_queried_object_id(),
'_wp_page_template', true);
if ($template_file_name != 'my-responsive-template.php') {
wpmp_switcher_init();
add_action('admin_menu', 'wpmp_switcher_admin_menu');
add_action('wp_footer', 'wpmp_switcher_wp_footer');
add_filter('stylesheet', 'wpmp_switcher_stylesheet');
add_filter('template', 'wpmp_switcher_template');
add_filter('option_home', 'wpmp_switcher_option_home_siteurl');
add_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl');
}
}
add_action('parse_query', 'wpmp_switcher_exclusions_init');
Le problème est que, même dès le hook parse_query
, la fonction wpmp_switcher_init
est appelée trop tard. Les fichiers functions.php
des modèles de bureau et mobile tentent de se charger, provoquant des erreurs fatales dues à des fonctions redéfinies.
Si le modèle peut être récupéré plus tôt, je ne sais pas comment le faire. Il semble que je doive en quelque sorte exécuter mon code à l'aide du hook setup_theme
. Si je peux comprendre comment faire cela, je n’aurai probablement besoin que d’une fonction dans mon plugin, puisque setup_theme
est appelé avant init
.
Toute aide est très appréciée!
Un moyen plus compact et WordPress-ish, en utilisant url_to_postid()
:
function wpmp_switcher_exclusions_init() {
$pid = url_to_postid( home_url( add_query_arg( array() ) ) );
if (
(int) $pid > 0 &&
get_post_meta( $pid, '_wp_page_template', TRUE ) === 'my-responsive-template.php'
) {
remove_action('init', 'wpmp_switcher_init');
remove_action('admin_menu', 'wpmp_switcher_admin_menu');
remove_action('wp_footer', 'wpmp_switcher_wp_footer');
remove_filter('stylesheet', 'wpmp_switcher_stylesheet');
remove_filter('template', 'wpmp_switcher_template');
remove_filter('option_home', 'wpmp_switcher_option_home_siteurl');
remove_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl');
}
}
add_action( 'setup_theme', 'wpmp_switcher_exclusions_init' );
J'ai trouvé la réponse sur StackOverflow (qu'en est-il?) Fondamentalement, mon code ressemble à ceci maintenant:
function wpmp_switcher_exclusions_init() {
// Try to get post slug from the URL since the global $post object isn't available this early
$post = get_page_by_path($_SERVER['REQUEST_URI'], OBJECT, 'page' );
if (!$post) $post = get_page_by_path(untrailingslashit($_SERVER['REQUEST_URI']), OBJECT, 'page' );
if (!$post) $post = get_page_by_path(substr(untrailingslashit($_SERVER['REQUEST_URI']),1), OBJECT, 'page' );
if (!$post) return;
$template_file_name = get_post_meta($post->ID, '_wp_page_template', true );
if ($template_file_name == 'my-responsive-template.php') {
remove_action('init', 'wpmp_switcher_init');
remove_action('admin_menu', 'wpmp_switcher_admin_menu');
remove_action('wp_footer', 'wpmp_switcher_wp_footer');
remove_filter('stylesheet', 'wpmp_switcher_stylesheet');
remove_filter('template', 'wpmp_switcher_template');
remove_filter('option_home', 'wpmp_switcher_option_home_siteurl');
remove_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl');
}
}
add_action('setup_theme', 'wpmp_switcher_exclusions_init');
J'espère que ceci aide quelqu'un d'autre!