2013-09-26 22 views
6

Come si legge nel titolo Sto provando a modificare una funzione chiamata da un tema padre in mio figlio, so che il tema figlio è impostato per essere caricato in anticipo quindi sono curioso se questo è anche possibile?Sovrascrivi una funzione con funzioni child themes.php

Il tema principale ha una funzione denominata ajax_search_box() in cui vorrei modificare una query e preferirei non modificare i file del tema principale nel caso in cui sia necessario aggiornarlo lungo la strada. essere il modo migliore per farlo?

Inoltre, per i punti bonus, come farei per farlo anche con un widget? Grazie in anticipo!

function SearchFilter($query) { 
    // If 's' request variable is set but empty 
    if (isset($_GET['s']) && empty($_GET['s']) && $query->is_main_query()){ 
     $query->is_search = true; 
     $query->is_home = false; 
    } 
    return $query; 
} 

add_filter('pre_get_posts','SearchFilter'); 

function ajax_search_box() { 
    if (isset($_GET["q"])) 
    { 
     $q = $_GET["q"];   
     global $wpdb;   
     $q = mysql_real_escape_string($q); 
     $q = $wpdb->escape($q); 

     $query = array(
      'post_status' => 'publish', 
      'order' => 'DESC', 
      's' => $q 
     ); 

     $get_posts = new WP_Query; 
     $posts = $get_posts->query($query); 

     // Check if any posts were found. 
     if (! $get_posts->post_count) 
      die(); 

     //Create an array with the results 
     foreach ($posts as $post) 
      echo $post->post_title . "|" . $post->ID . "\n"; 
    } 
    die(); 
} 
// creating Ajax call for WordPress 
add_action('wp_ajax_nopriv_ajax_search_box', 'ajax_search_box'); 
add_action('wp_ajax_ajax_search_box', 'ajax_search_box'); 
+1

Mostra la funzione nel contesto. – brasofilo

+0

Aggiunta ora la funzione. – Jassi

risposta

5

tema il genitore ha bisogno di controllare se (function_exists ('ajax_search_box')) e se non esiste allora sarà dichiararlo.

Se il tema padre verifica se la funzione esiste, è possibile dichiararla prima e fare ciò che si desidera.

Se il tema principale non controlla, contatta l'autore del tema per vedere se rilascerà quel cambiamento per il prossimo aggiornamento .... e lo codificherà anche tu. In questo modo, quando il tema si aggiorna, sarai ancora pronto.

+1

Per assicurarmi che lo stia seguendo .. Aggiungerei if (! Function_exists ('ajax_search_box')) {'attorno alla funzione all'interno del parent functions.php e quindi duplicarlo al mio child functions.php e modificarlo ? – Jassi

+2

Sì. Nel tema figlio non è necessario controllare se la funzione esiste (a meno che non si preveda di dichiararla in modo diverso in base al codice ...) –

2

Pausa zero functions.php, write your own plugin.

<?php 
/** 
* Plugin Name: Manipulate the Parent 
* Requires: PHP5.3+ 
*/ 

add_action('after_setup_theme', function() 
{ 
    remove_filter('pre_get_posts','SearchFilter');  
    // now add your own filter 
    add_filter('pre_get_posts', 'your_callback_for_your_filter'); 
}); 

function your_callback_for_your_filter() 
{ 
    // do stuff 
} 
+0

Quindi, in base al codice che ho aggiunto sopra, se ho avuto bisogno di rimuovere un'azione invece di un filtro (The ajax_search_box è impostato come azione) Vorrei usare 'remove_action ('wp_ajax_ajax_search_box', 'ajax_search_box');' e quindi creare una funzione/add_filter e chiamare il codice lì dentro? Sto facendo del mio meglio per capirlo, grazie! – Jassi