web-dev-qa-db-fra.com

Quel est le premier moment où je peux obtenir l'ID d'objet demandé?

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!

3
Andy

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' );
1
gmazzap

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!

1
Andy